我有一个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
答案 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