sed:查找连续*类似的*行 - 邮政编码

时间:2012-01-14 03:12:51

标签: sed

我有一个地址文件,其中一些地址有两次城市拉链。

实施例

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 个答案:

答案 0 :(得分:1)

已更新以包含第一个匹配而非第二个匹配。

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

答案 1 :(得分:1)

如果您仍想使用sed

保持第一次出现

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

保持第二次出现

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

此外,优先使用[[:digit:]]而不是[0-9],因为前者适用于各种语言区域。

答案 2 :(得分:0)

这可能对您有用:

 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

就像这个以及多个连续的类似的行一样,但是将整个文件放入模式空间。