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

Display Second Result of Duplicate Lines in Text File

我正在尝试显示文本文件中重复行的第二个结果。

数据: 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

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

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

60
78

为了避免在每行之后换行:

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

60 78

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

awk '
{
  delete value
  num=split([=10=],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([=11=],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.

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

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

注意 - 如果输入未排序(或重复行不相邻),则需要先对其进行排序。

$ 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