如何删除基于列值的重复行?

时间:2014-04-03 21:55:26

标签: linux bash awk delete-row

给出下表

 123456.451 entered-auto_attendant
 123456.451 duration:76 real:76
 139651.526 entered-auto_attendant
 139651.526 duration:62 real:62`
 139382.537 entered-auto_attendant 

使用基于Linux的bash shell脚本,我想根据第1列(具有长号的那个)的值删除所有行。考虑到这个数字是一个可变数字

我已经尝试了

awk '{a[$3]++}!(a[$3]-1)' file

sort -u | uniq

但是我没有得到类似这样的结果,在第一列的所有值之间进行比较,删除所有重复项并显示它

 123456.451 entered-auto_attendant
 139651.526 entered-auto_attendant
 139382.537 entered-auto_attendant 

4 个答案:

答案 0 :(得分:6)

你没有给出预期的输出,这对你有用吗?

 awk '!a[$1]++' file

使用您的数据,输出为:

123456.451 entered-auto_attendant
139651.526 entered-auto_attendant
139382.537 entered-auto_attendant

并且此行仅打印唯一的column1行:

 awk '{a[$1]++;b[$1]=$0}END{for(x in a)if(a[x]==1)print b[x]}' file

输出:

139382.537 entered-auto_attendant

答案 1 :(得分:3)

默认情况下,

uniq会比较整行。由于您的线条不相同,因此不会删除它们。

您可以使用sort方便地按第一个字段排序,也可以删除它的副本:

sort -t ' ' -k 1,1 -u file
  • -t ' '字段以空格分隔
  • -k 1,1:只看第一个字段
  • -u:删除重复项

此外,您可能已经看到了用于重复删除行的awk '!a[$0]++'技巧。您只能使用awk '!a[$1]++'在第一列上制作此重复数据删除。

答案 2 :(得分:1)

使用awk:

awk '!($1 in a){a[$1]++; next} $1 in a' file
123456.451 duration:76 real:76
139651.526 duration:62 real:62

答案 3 :(得分:1)

尝试此命令

awk '!x[$1]++ { print $1, $2 }' file