在文本文件中显示重复行的第二个结果

Posted

技术标签:

【中文标题】在文本文件中显示重复行的第二个结果【英文标题】:Display Second Result of Duplicate Lines in Text File 【发布时间】:2021-09-10 15:07:16 【问题描述】:

我正在尝试。

数据: 60 60 61 64 63 78 78

重复行: 60 60 78 78

尝试的代码: echo "60 60 61 64 63 78 78" | sed 's/ /\n/g' | uniq -D | tail -1

当前结果: 78

预期结果: 60 78

【问题讨论】:

那你为什么用| tail -1 echo "60 60 61 64 63 78 78" | xargs -n1 | sort | uniq -d | xargs 【参考方案1】:

你可以试试这个gnu awk 解决方案:

s='60 60 61 64 63 78 78'
awk -v RS='[[:space:]]+' '++fq[$0] == 2' <<< "$s"

60
78

为了避免在每一行之后出现换行符:

awk -v RS='[[:space:]]+' '++fq[$0] == 2 printf "%s", $0 RT' <<< "$s"

60 78

【讨论】:

【参考方案2】:

考虑到您的 Input_file 中可能有多行,那么您可以尝试以下操作。

awk '

  delete value
  num=split($0,arr," ")
  for(i=1;i<=num;i++)
    value[arr[i]]++
  
  for(i=1;i<=num;i++)
    if(value[arr[i]]>1)
      print arr[i]
      delete value[arr[i]]
    
  

'  Input_file

说明:为上述添加详细说明。

awk '                          ##Starting awk program from here.

  delete value                 ##Deleting value array here.
  num=split($0,arr," ")        ##Splitting current line to array arr here.
  for(i=1;i<=num;i++)         ##Traversing through all fields here.
    value[arr[i]]++            ##Creating value array with value of arr array.
  
  for(i=1;i<=num;i++)         ##Traversing through all fields here.
    if(value[arr[i]]>1)       ##Checking condition if value array value is coming more than 1 times then do following.
      print arr[i]             ##printing array value here(which is value which comes more than 1 time).
      delete value[arr[i]]     ##Deleting value array value to avoid duplicate printing here.
    
  

'  Input_file                  ##Mentioning Input_file name here.

【讨论】:

【参考方案3】:

因此,如果您不想,请不要使用tail -1。而且不是全部打印,而是每个副本打印一次。

echo "60 60 61 64 63 78 78" | sed 's/ /\n/g' | sort | uniq -d

注意——如果输入没有排序(或者重复行不相邻),需要先排序。

【讨论】:

我正在寻找 all 重复行的 second 结果,而不仅仅是最后一行。 评论毫无意义。 second result of all duplicate lines, 如果所有行都相同(重复),则顺序无关紧要。该行是第二行还是第一行或第三行或任何顺序都无关紧要,因为所有重复行的内容都是相同的。我不明白为什么重复组的“第二个结果”应该是相关的。【参考方案4】:
$ printf '%s\n' 60 60 61 64 63 78 78 | uniq -d
60
78

以上假设一个硬编码的数字列表适合您,因为根据您问题中的示例,您认为echo "60 60 61 64 63 78 78" | sed 's/ /\n/g' | uniq -D | tail -1 适合您。如果您需要先将它们存储在变量中,然后将其设为数组变量:

$ vals=(60 60 60 61 64 63 78 78)
$ printf '%s\n' "$vals[@]" | uniq -d
60
78

【讨论】:

以上是关于在文本文件中显示重复行的第二个结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIPickerView 的第一个组件中显示数据,直到第二个组件中特定行的开始?

根据数组中的重复模式更改 SwiftUI 列表中文本字段的第二次出现

将第一个文件的第一列与第二个文件中的行匹配,然后将第二个文件中匹配行的最后一列插入第一个文件中的新第一列

shell 比较两个文本不同

第二个 applyBindings 不会触发 [重复]

sed多行文本处理