sed: поиск последовательных * похожих * строк - почтовых индексов - PullRequest
1 голос
/ 14 января 2012

У меня есть файл с адресами, в котором на некоторых адресах дважды указана строка zip города.

Пример

Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
TIMBUKTU, AK 99909

Я бы хотел оставить первое, поэтому я подумал, что может подойти однострочная команда sed, такая как:

sed -e '$!N' -e "s/\(.* 9[0-9]\{4\}\)\n.* 9[0-9]\{4\}/\1/" processme.txt

Странная часть: она работает с файлами без пустых строк, но не с.

???

Мысли

Ответы [ 3 ]

1 голос
/ 14 января 2012

В случае, если вы все еще хотите использовать sed

Сохранить 1-е вхождение

sed 'N;/9[[:digit:]]\{4\}\n.*9[[:digit:]]\{4\}/{P;d;D};P;D' processme.txt

Сохранить 2-е вхождение

sed 'N;/9[[:digit:]]\{4\}\n.*9[[:digit:]]\{4\}/D;P;D' processme.txt

Кроме того, использование [[:digit:]] над [0-9] является предпочтительным, так как первое работает в разных локалях.

1 голос
/ 14 января 2012

Обновлено , чтобы включить первое совпадение вместо второго.

awk 'NF{a=$NF; b=$0; getline; if(a~$NF) {print b;next} else {print b; print $0; next}}1' file

Входной файл:

[jaypal:~/Temp] cat file
Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
TIMBUKTU, AK 99909

Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
TIMBUKTU, AK 99909
Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
TIMBUKTU, AK 99909

Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
TIMBUKTU, AK 99909

Выход:

[jaypal:~/Temp] awk 'NF{a=$NF; b=$0; getline; if(a~$NF) {print b;next} else {print b; 

print $0; next}}1' file
Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909

Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909

Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
0 голосов
/ 14 января 2012

Это может работать для вас:

 sed ':a;$!N;/ \(9[0-9]\{4\}\)\n.*\(9[0-9]\{4\}\)/s/\n.*//;ta;P;D' file

Обрабатывает несколько последовательных похожих строк. Или это:

sed '/9[0-9]\{4\}/!b;:a;$!{N;/\n\s*$/ba};s/\(9[0-9]\{4\}\)\(\n\s*\)*[^\n]*9[0-9]\{4\}/\1/' file

Обрабатывает пустые строки между последовательными похожими строками.

sed ':a;$!{N;ba};s/\(9[0-9]\{4\}\)\(\n\s*\)*[^\n]*9[0-9]\{4\}/\1/;ta' file

Так же, как и несколько последовательных похожих строк, но весь файл перебрасывается в пространство образца.

...