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

时间:2018-05-25 21:43:40

标签: 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 

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

如何跳过'2r'

Record::whereHas('customRecords', function ($query) use ($searchTerm) {
    $query->where('custom_title', 'like', '%'.$searchTerm.'%');
})->with(['customRecords' => function ($query) use ($searchTerm) {
    $query->where('custom_title', 'like', '%'.$searchTerm.'%');
}])->get(['id', 'another_field', 'another_field_2']);

$ awk -F, ' ++a[$2] == 2 && $2 != "2r" { print $2 } ' file 7f @r 向哈希数组添加一个元素并将其值增加1,即计算第二列中每个值的出现次数。

答案 1 :(得分:0)

  1. 使用cut -d, -f2
  2. 仅获取第二列
  3. sort
  4. uniq -d获取重复的行
  5. grep -Fv 2r排除值,或grep -Fv -e foo -e bar …排除多个值
  6. 换句话说就是这样:

    cut -d, -f2 input.csv | sort | uniq -d | grep -Fv 2r
    

    根据数据,如果您在管道中先前移动grep可能会更快,但您应该通过一些基准测试来验证。