显示文本文件中重复行的第二个结果
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
我正在尝试显示文本文件中重复行的第二个结果。
数据:
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