从列中删除重复项

时间:2014-06-19 17:24:23

标签: perl awk sed

我想删除文件中的重复行(第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

但这不会产生我想要的输出。

4 个答案:

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

如果当前行中的第二个字段不重复,则打印当前行。