Bash:在 X 列中保留所有具有重复值的行

Pat*_*ick 3 bash awk

我有一个包含几千行和 20 多列的文件。我现在只想保留第 3 列中与其他行具有相同电子邮件地址的行。

文件:(名字;姓氏;电子邮件;...)

Mike;Tyson;mike@tyson.com
Tom;Boyden;tom@boyden.com
Tom;Cruise;mike@tyson.com
Mike;Myers;mike@tyson.com
Jennifer;Lopez;jennifer@lopez.com
Andre;Agassi;tom@boyden.com
Paul;Walker;paul@walker.com
Run Code Online (Sandbox Code Playgroud)

我想保留所有具有匹配电子邮件地址的行。在这种情况下,预期的输出将是

Mike;Tyson;mike@tyson.com
Tom;Boyden;tom@boyden.com
Tom;Cruise;mike@tyson.com
Mike;Myers;mike@tyson.com
Andre;Agassi;tom@boyden.com
Run Code Online (Sandbox Code Playgroud)

如果我使用

awk -F';' '!seen[$3]++' file
Run Code Online (Sandbox Code Playgroud)

我将丢失电子邮件地址的第一个实例,在本例中为第 1 行和第 2 行,并且仅保留重复项。

有没有办法保留所有行?

Ken*_*ent 6

这个 awk one-liner 将帮助您:

awk -F';' 'NR==FNR{a[$3]++;next}a[$3]>1' file file
Run Code Online (Sandbox Code Playgroud)

它两次传递文件,第一次计算出现次数,第二次将检查并输出。

使用给定的输入示例,它打印:

Mike;Tyson;mike@tyson.com
Tom;Boyden;tom@boyden.com
Tom;Cruise;mike@tyson.com
Mike;Myers;mike@tyson.com
Andre;Agassi;tom@boyden.com
Run Code Online (Sandbox Code Playgroud)