bash - Unix:在 csv 文件的列中查找重复项,省略一个可能的值

标签 bash csv unix awk duplicates

我希望 bash 脚本的一行或两行代码可以在 2.5G csv 文件的列中查找和打印重复的项目,但我知道经常重复的项目除外。

数据文件有一个标题,但它没有重复,所以我不担心解释标题的代码是否存在。

下面是数据的示例:

header,cat,Everquest,mermaid
1f,2r,7g,8c
xc,7f,66,rp
Kf,87,gH,||
hy,7f,&&,--
rr,2r,89,))
v6,2r,^&,!c
92,@r,hd,m
2r,2r,2r,2r
7f,7f,7f,7f
9,10,11,12
7f,2r,7f,7f
76,@r,88,u|

我正在寻找输出:

7f
@r

因为这两个都在第二列中重复。如您所见,2r 也是重复的,但它经常重复而且我知道,所以我只想忽略它。

需要明确的是,除了常见值之外,我不知道重复项的值,在我的真实数据文件中,它实际上是“无”一词。上面是'2r'。

我读了here我可以做类似的事情

awk -F, ' ++A[$2] > 1 { print $2; exit 1 } ' input.file

但是,我不知道如何跳过“2r”,也不知道++A 是什么意思。

我已经阅读了 awk 手册,但恐怕我对我提出的问题感到有些困惑。

此外,

uniq -d 

根据其他一些问题和答案看起来很有希望,但我仍然不确定如何跳过我想忽略的值。

预先感谢您的帮助。

最佳答案

如何跳过“2r”:

$ awk -F, ' ++a[$2] == 2 && $2 != "2r" { print $2 } ' file
7f
@r

++a[$2] 将一个元素添加到哈希数组中,并将其值增加 1,即计算第二列中每个值的出现次数。

关于bash - Unix:在 csv 文件的列中查找重复项,省略一个可能的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537216/

相关文章:

bash - $* 和 $@ 的区别

Bash foreach 循环

linux - 在 Shell 脚本中打印前一天和后一天的文件路径

将 OneDrive 文件读取到 R

sqlite - 在python的多个选项卡中将数据从sqlite导出到Excel文件

bash - 使用 bash 脚本的输出作为 Terraform 中的变量

javascript - 从未知对象数组制作 HTML 表格

linux - 如何使用 shell 脚本去除 linux 进程 ID 中的多余字符

c - 如何在 C 中设置主目录和路径目录?

c - 使用 strtok 而不包含 string.h,请解释行为