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

标签 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
我想保留所有具有匹配电子邮件地址的行。在这种情况下,预期的输出将是
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
如果我使用
awk -F';' '!seen[$3]++' file
我将丢失电子邮件地址的第一个实例,在本例中为第 1 行和第 2 行,并且仅保留重复项。
有没有办法保留所有行?

最佳答案

这个 awk one-liner 将帮助您:

awk -F';' 'NR==FNR{a[$3]++;next}a[$3]>1' file file
它两次传递文件,第一次计算出现次数,第二次将检查并输出。
使用给定的输入示例,它打印:
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

关于Bash:在 X 列中保留所有具有重复值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63992814/

相关文章:

linux - 如何从 bash 中的 .csv 文件的第一行获取特定列?

bash - 按顺序打印正则表达式匹配的每个字符串

linux - 将当前目录中的所有可执行文件移动到单独文件夹的 shell 脚本

linux - 如何将 `grep ' ^2013-12-0 3'` 更改为 "2 days ago"?

linux - 将一个文件中的特定行替换为另一文件中包含的数据

sed - 将一个文件中的数据分配给另一个文件

bash - 如何在 Bash 中管理长路径?

linux - 使用 sed 删除 _ 和 - 字符

regex - 在 bash/sed 中,如何匹配小写字母后跟大写字母?

bash - 在bash循环中减去 float