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

use*_*949 7 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 
Run Code Online (Sandbox Code Playgroud)

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

我试过了

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

sort -u | uniq
Run Code Online (Sandbox Code Playgroud)

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

 123456.451 entered-auto_attendant
 139651.526 entered-auto_attendant
 139382.537 entered-auto_attendant 
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 7

uniq默认情况下,比较整行。由于您的线条不相同,因此它们不会被删除。

您可以使用方便sort地按第一个字段进行排序,也可以删除它的重复项:

sort -t ' ' -k 1,1 -u file
Run Code Online (Sandbox Code Playgroud)
  • -t ' '字段之间用空格分隔
  • -k 1,1: 只看第一个字段
  • -u: 删除重复项

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


Ken*_*ent 6

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

 awk '!a[$1]++' file
Run Code Online (Sandbox Code Playgroud)

使用您的数据,输出是:

123456.451 entered-auto_attendant
139651.526 entered-auto_attendant
139382.537 entered-auto_attendant
Run Code Online (Sandbox Code Playgroud)

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

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

输出:

139382.537 entered-auto_attendant
Run Code Online (Sandbox Code Playgroud)