如何仅获取 bash 中特定列的重复行
How to obtain only repeated lines for a specific column in bash
假设我在 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,4 myfile | uniq -D
,但我找不到如何告诉 uniq
使用第 4 列。
谢谢!
能否请您尝试以下。
awk '
{
a[$NF]++
b[$NF]=(b[$NF]?b[$NF] ORS:"")[=10=]
}
END{
for(i in a){
if(a[i]>1){
print b[i]
}
}
}
' Input_file
或者,如果您想对输出进行排序,请尝试以下操作。
awk '
{
a[$NF]++
b[$NF]=(b[$NF]?b[$NF] ORS:"")[=11=]
}
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
1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2
你很接近。您需要跳过最后一个之前的字段。
$ sort -k4 file | uniq -f3 -D
1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2
假设我在 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,4 myfile | uniq -D
,但我找不到如何告诉 uniq
使用第 4 列。
谢谢!
能否请您尝试以下。
awk '
{
a[$NF]++
b[$NF]=(b[$NF]?b[$NF] ORS:"")[=10=]
}
END{
for(i in a){
if(a[i]>1){
print b[i]
}
}
}
' Input_file
或者,如果您想对输出进行排序,请尝试以下操作。
awk '
{
a[$NF]++
b[$NF]=(b[$NF]?b[$NF] ORS:"")[=11=]
}
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
1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2
你很接近。您需要跳过最后一个之前的字段。
$ sort -k4 file | uniq -f3 -D
1 3 6 name1
3 4 2 name1
1 2 7 name2
7 8 2 name2