查找转义第一列的重复行

时间:2016-10-06 09:33:06

标签: bash

我有一个tsv文件,其中包含来自某些活动参与者的数据。这是一个小片段:

...
sub-09          37   F    19780726   20160328    20160329
sub-10          38   F    19780208   20160406    20160407
sub-11          39   M    19770511   20160704    20160705
...
sub-42          37   F    19780726   20160328    20160329
...

请注意,sub-09和sub-42是重复的。

在BASH中,如何找到重复的行而忽略第一列(或通常是任何其他列)? 我见过类似的帖子,例如this one,但我找不到合适的答案。理想情况下,我会同时出现所有重复项,如:

预期产出:

sub-09          37   F    19780726   20160328    20160329
sub-42          37   F    19780726   20160328    20160329

3 个答案:

答案 0 :(得分:2)

使用uniq -d显示重复项。使用其-f选项跳过字段。由于uniq需要输入排序,首先忽略第一列:

sort -nk2 file | uniq -f1 -d

如果您想要所有重复项,请使用-D代替-d

答案 1 :(得分:1)

这是一个基于awk的解决方案,可以避免对文件进行排序(对于大文件来说这可能相当昂贵):

awk '{
   p = $1
   $1 = ""
   freq[$0]++
   col1[$0,freq[$0]] = p
} 
END {
   for (i in freq)
      for (j=1; freq[i]>1 && j<=freq[i]; j++)
         print col1[i,j] i
 }' file

sub-09 37 F 19780726 20160328 20160329
sub-42 37 F 19780726 20160328 20160329

答案 2 :(得分:0)

awk 'FNR==NR{$1="";a[$0]++;next}{s=$0;$1="";if(a[$0]>=2) print s}' file file