【问题标题】:How to obtain only repeated lines for a specific column in bash如何仅获取bash中特定列的重复行
【发布时间】:2020-04-17 14:11:28
【问题描述】:

想象一下我在 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

我怎样才能只提取那些重复显示字段“名称”的行并对其进行排序?

我的预期输出是:

1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2

我试图使用sort -k4,4 myfile | uniq -D,但我不知道如何告诉uniq 使用第四列。 谢谢!

【问题讨论】:

  • 重复总是只出现两次吗?
  • 不,重复可以发生不同的时间

标签: bash sorting uniq


【解决方案1】:

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

$ 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 -k 4,4 file | grep -Poz '([0-9]+ ){3}([^ ]+)\n(([0-9]+ ){3}\2\n)+'
【解决方案2】:

请您尝试关注一下。

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

【讨论】:

    【解决方案3】:

    你可以使用这个awk + sort:

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

    1 3 6 name1
    3 4 2 name1
    1 2 7 name2
    7 8 2 name2
    

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 2013-01-17
      • 2012-12-24
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2018-05-09
      • 2016-12-07
      • 2017-03-09
      相关资源
      最近更新 更多