Shell脚本 - 重复记录

时间:2011-04-29 07:42:33

标签: shell

我在删除重复的条目时遇到问题。(我在Shell中不好!)。这是情况 - 应用程序创建一个平面文本文件每行是一条记录,每个字段由分隔符“〜|”(不包括引号)分隔。所以记录看起来像 -

Field1~|Field2~|Field3~|Field4~|Field5~|Field6~|Field7~|

有些记录是重复的。重复记录由field-Field2的值决定。如何编写shell脚本/ awk / sed以根据此条件删除重复记录?然后脚本必须将输出写入其他文件。 我本可以在应用程序本身做到这一点,但由于性能问题,它无法完成。 谢谢你的帮助。

输入文件

Field1~|ABA~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|PQR~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|XYZ~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|ABA~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|RST~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|PQR~|Field3~|Field4~|Field5~|Field6~|Field7~|

输出应为 -

Field1~|ABA~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|PQR~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|XYZ~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|RST~|Field3~|Field4~|Field5~|Field6~|Field7~|

(记录顺序无关紧要。)

2 个答案:

答案 0 :(得分:2)

不确定我是否正确理解了这个问题,但这就是你要找的东西吗?:

的test.txt:

Field1~|Field2~|Field3~|Field4~|Field5~|Field6~|Field7~|
foo~|Field2~|bar~|Field4~|Field5~|Field6~|Field7~|
Field1~|foobar~|Field3~|Field4~|Field5~|Field6~|Field7~|

致电sort

sort --field-separator="~" --key 2,2 --unique test.txt

结果:

Field1~|Field2~|Field3~|Field4~|Field5~|Field6~|Field7~|
Field1~|foobar~|Field3~|Field4~|Field5~|Field6~|Field7~|

答案 1 :(得分:1)

如果要删除所有重复项

nawk -F'~|' '{a[$2]++;b[$2]=$0}END{for(i in a) if (a[i]==1){print b[i]} }' file

如果您只想保留一个版本的重复记录

nawk -F'~|' '!a[$2]++' file