如何在bash中仅获取特定列的重复行

如何在bash中仅获取特定列的重复行,bash,sorting,uniq,Bash,Sorting,Uniq,假设我在bash中有这个文件: 1 3 6 name1 1 2 7 name2 3 4 2 name1 2 2 2 name3 7 8 2 name2 1 2 9 name4 我如何才能提取那些重复显示字段“name”的行并对它们进行排序 我的预期产出是: 1 3 6 name1 3 4 2 name1 1 2 7 name2 7 8 2 name2 我试图使用sort-k4,4myfile | uniq-D,但我找不到如何告诉uniq使用第四列。 谢谢 你能试试下面的吗 awk ' {

假设我在bash中有这个文件:

1 3 6 name1
1 2 7 name2
3 4 2 name1
2 2 2 name3
7 8 2 name2
1 2 9 name4
我如何才能提取那些重复显示字段“name”的行并对它们进行排序

我的预期产出是:

1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2
我试图使用
sort-k4,4myfile | uniq-D
,但我找不到如何告诉
uniq
使用第四列。
谢谢

你能试试下面的吗

awk '
{
  a[$NF]++
  b[$NF]=(b[$NF]?b[$NF] ORS:"")$0
}
END{
  for(i in a){
    if(a[i]>1){
      print b[i]
    }
  }
}
'  Input_file
或者,如果要对输出进行排序,请尝试以下操作

awk '
{
  a[$NF]++
  b[$NF]=(b[$NF]?b[$NF] ORS:"")$0
}
END{
  for(i in a){
    if(a[i]>1){
      print b[i]
    }
  }
}
'  Input_file  |  sort -k4

您可以使用此
awk+sort

awk 'FNR==NR{freq[$NF]++; next} freq[$NF] > 1' file{,} | sort -k4


你很接近。您需要跳过最后一个字段之前的字段

$ sort -k4 file | uniq -f3 -D
1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2

重复总是只发生两次吗?不,重复可以发生在不同的时间。我的尝试更让人困惑。使用GNU grep:
sort-k4,4文件| grep-Poz'([0-9]+){3}([^]+)\n([0-9]+){3}\2\n)+'
$ sort -k4 file | uniq -f3 -D
1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2