Linux 在特定列上使用uniq-d?

Linux 在特定列上使用uniq-d?,linux,unix,awk,Linux,Unix,Awk,有一个这样的文本文件 john,3 albert,4 tom,3 junior,5 max,6 tony,5 我正在尝试获取column2值相同的记录。我想要的输出 john,3 tom,3 junior,5 tony,5 我正在检查是否可以在第二列中使用uniq-d 您可以在字段(列)上使用uniq,但在您的情况下并不容易 Uniq的-f和-s选项分别按字段和字符过滤。然而,这两者都不完全符合我们的要求 -f用空格分隔字段,并用逗号分隔。 -s跳过固定数量的字符,您的姓名长度可变 但总体而

有一个这样的文本文件

john,3
albert,4
tom,3
junior,5
max,6
tony,5
我正在尝试获取column2值相同的记录。我想要的输出

john,3
tom,3
junior,5
tony,5

我正在检查是否可以在第二列中使用
uniq-d

您可以在字段(列)上使用uniq,但在您的情况下并不容易

Uniq的
-f
-s
选项分别按字段和字符过滤。然而,这两者都不完全符合我们的要求

-f
用空格分隔字段,并用逗号分隔。
-s
跳过固定数量的字符,您的姓名长度可变


但总体而言,
uniq
通过将重复项合并到唯一行来压缩输入。实际上,您希望保留重复项并消除单例项,这与使用uniq所做的相反。看起来您需要一种不同的方法。

您可以在字段(列)上使用uniq,但在您的情况下并不容易

Uniq的
-f
-s
选项分别按字段和字符过滤。然而,这两者都不完全符合我们的要求

-f
用空格分隔字段,并用逗号分隔。
-s
跳过固定数量的字符,您的姓名长度可变

但总体而言,
uniq
通过将重复项合并到唯一行来压缩输入。实际上,您希望保留重复项并消除单例项,这与使用uniq所做的相反。看来您需要一种不同的方法。

这里有一种使用方法。它读取输入文件两次,但无需排序:

awk -F, 'FNR==NR { a[$2]++; next } a[$2] > 1' file file
结果:

john,3
tom,3
junior,5
tony,5
简要说明:

FNR==NR
是一种常见的AWK习惯用法,它适用于参数列表中的第一个文件。这里,列2被添加到数组中并递增。在第二次读取文件时,我们只需检查第二列的值是否大于一(next关键字跳过对其余代码的处理)。它读取输入文件两次,但无需排序:

awk -F, 'FNR==NR { a[$2]++; next } a[$2] > 1' file file
结果:

john,3
tom,3
junior,5
tony,5
简要说明:


FNR==NR
是一种常见的AWK习惯用法,它适用于参数列表中的第一个文件。这里,列2被添加到数组中并递增。在第二次读取文件时,我们只需检查第二列的值是否大于一(下一个
next
关键字跳过处理其余代码)。

我已经试过了,它实际上不起作用。我已经试过了,它实际上肯定不起作用。不过,我不确定它是否可以通过bash和命令行工具简单地完成。其他人可能希望在这里称重。使用脚本语言(如Perl、Python等)可以快速、轻松地完成。如果Perl对您有用的话,我不会花很长时间。不过,我不确定它是否可以通过bash和命令行工具简单地完成。其他人可能希望在这里称重。使用脚本语言(如Perl、Python等)可以快速轻松地完成。如果Perl对您有用的话,我不会花很长时间使用它。非常感谢。如果文件中有多个字段,并且正在比较第一个字段和第四个字段,如何扩展该字段?我的输出也应该是第一个字段和四个字段。@mariswamykantha:如果我理解正确,我认为您可以简单地使用:
awk-F,'FNR==NR{a[$1,$4]++;next}a[$1,$4]>1'文件{,}
非常感谢。如果文件中有多个字段,并且正在比较第一个字段和第四个字段,如何扩展该字段?我的输出也应该是第一个字段和四个字段。@mariswamykantha:如果我理解正确,我认为您可以简单地使用:
awk-F,'FNR==NR{a[$1,$4]++;next}a[$1,$4]>1'文件{,}