sed:查找连续的*相似的*行--邮政编码
我有一个包含地址的文件,其中一些地址有两次城市邮政编码 范例sed:查找连续的*相似的*行--邮政编码,sed,Sed,我有一个包含地址的文件,其中一些地址有两次城市邮政编码 范例 Joe Schmoe 4545 RANDOM ADDRESS ST NE TIMBUKTU AK 99909 TIMBUKTU, AK 99909 我想保留第一个,所以我认为像下面这样的sed-one-liner可能会起作用: sed -e '$!N' -e "s/\(.* 9[0-9]\{4\}\)\n.* 9[0-9]\{4\}/\1/" processme.txt 奇怪的是:它适用于没有空行的文件,但不适用于有空行的文件
Joe Schmoe
4545 RANDOM ADDRESS ST NE
TIMBUKTU AK 99909
TIMBUKTU, AK 99909
我想保留第一个,所以我认为像下面这样的sed-one-liner可能会起作用:
sed -e '$!N' -e "s/\(.* 9[0-9]\{4\}\)\n.* 9[0-9]\{4\}/\1/" processme.txt
奇怪的是:它适用于没有空行的文件,但不适用于有空行的文件
想法?更新了以包含第一场比赛,而不是第二场比赛
awk 'NF{a=$NF; b=$0; getline; if(a~$NF) {print b;next} else {print b; print $0; next}}1' file
输入文件:
输出:
如果您仍然想使用
sed
保持第一次出现
保持第二次出现
此外,最好在
[0-9]
上使用[[:digit:]]
,因为前者适用于不同的地区。这可能适用于您:
sed ':a;$!N;/ \(9[0-9]\{4\}\)\n.*\(9[0-9]\{4\}\)/s/\n.*//;ta;P;D' file
这将处理多行连续的相似行。
或者这个:
这将处理连续相似行之间的空行
sed ':a;$!{N;ba};s/\(9[0-9]\{4\}\)\(\n\s*\)*[^\n]*9[0-9]\{4\}/\1/;ta' file
这与多行连续的相似行一样,但会将整个文件拖入模式空间。您可以不考虑我的答案,因为它使用了
awk
。我没有看到sed
only标记。实际上,我只需要解决这个问题--awk很好。我只是更熟悉塞德。古老的“如果你只有一把锤子……”综合症。听起来不错我对答案又做了一个修改。你能用你的文件测试一下吗。你的awk语句也不起作用。我在一个样本文件上做了测试。如果你能告诉我问题出在哪里,我也许能解决。但是行号不一样,只是相似。我需要匹配邮政编码。最后,我想在一个shell脚本中针对一组邮政编码运行它。是的,我只匹配最后一个字段,即邮政编码,如条件if(a==NF)
中所示。我将其修改为if(a~$NF)
您尝试过最新版本吗?你有什么问题。我最近将答案更新为包含NF
。我的错误是,您的awk声明有效。不知怎的,这个城市的邮政编码被复制了3到4次。它在双线情况下确实有效——谢谢!我想这也解释了我的sed声明失败的原因。我想他希望保留第一个地址,而不是最后一个。是的,我希望保留第一个。@Bubnoff好的,我更新了我的答案以适应这两种情况。请注意,我的第一个答案保留第二次出现的唯一原因是因为你接受的答案就是这样做的。明白了,谢谢。我将对照我的记录检查一下,看看情况如何。这是一个很难破译的记录,但我会尝试一下。
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
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