我想删除文件中的重复行(第2列的副本),为每个副本保留完整的第一行。
示例输入:
10.4.14.1,201s-1-S
10.4.16.1,201s-1-S
10.4.17.1,40-MDF-S
10.4.18.1,201s-1-S
10.4.19.1,201s-1-S
10.4.20.1,201s-1-S
10.4.21.1,201s-1-S
10.4.22.1,201s-1-S
10.4.23.1,201s-1-S
10.4.24.1,MDF-S
期望的结果:
10.4.14.1,201s-1-S
10.4.17.1,40-MDF-S
10.4.24.1,MDF-S
到目前为止,我已经尝试了
awk '!k[$5]++' file
和
awk '!_[$5]++' file
但这不会产生我想要的输出。
答案 0 :(得分:3)
使用perl one-liner
perl -aF, -lne 'print if ! $seen{$F[1]}++' data.txt
输出:
10.4.14.1,201s-1-S
10.4.17.1,40-MDF-S
10.4.24.1,MDF-S
切换:
-a
:拆分空间线并将其加载到数组@F
-F/pattern/
:-a
切换(//
的split()模式是可选的)-l
:启用行结束处理-n
:为输入文件中的每一行创建一个while(<>){..}
循环。 -e
:告诉perl
在命令行上执行代码。 答案 1 :(得分:3)
您需要将分隔符设置为,
(默认分隔符为空格)并使用正确的列($2
)作为&#34;看到&#34;阵列。
$ awk -F, '!seen[$2]++' file
10.4.14.1,201s-1-S
10.4.17.1,40-MDF-S
10.4.24.1,MDF-S
答案 2 :(得分:1)
你也可以使用sort
:
$ sort -t, -k2 -u file
10.4.14.1,201s-1-S
10.4.17.1,40-MDF-S
10.4.24.1,MDF-S
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed -rn '1!G;/^[^,]*(,[^\n]*)\n.*\1/!P;h' file
如果当前行中的第二个字段不重复,则打印当前行。