grep是否允许搜索重复?

时间:2011-10-05 08:34:47

标签: grep duplicates search

我有很多(接近100个)大csv文件,在第一列中有sellID。我知道有些sellID在2个或更多文件中重复2次或更多次。有可能用grep找到所有这些重复的sellID(创建map sellID-file_name)?或者为此目的存在另一个开源应用程序?我的操作系统 - CentOS。

4 个答案:

答案 0 :(得分:1)

相关问题:https://serverfault.com/questions/66301/removing-duplicate-lines-from-file-with-grep

您可以在一个文件中捕获所有文件,然后按照上面链接中的建议查找欺骗文件。

顺便说一句,目前尚不清楚你是想只保留欺骗还是删除它们。

答案 1 :(得分:1)

试试这个:

#Save duplicate columns
find path -type f -name '*.csv' -execdir cut -d, -f1 {} \+ | sort | uniq -d \
  > duplicate-ids.log
#List duplicate records
find path -type f -name '*.csv' -execdir grep -F -f duplicate-ids.log {} \+

注意:我没有测试它。

答案 2 :(得分:1)

又一个答案:

如果您的SellID是固定长度(比如6个字符),您可以使用

sort data.txt | uniq -w 6 -D

这将打印出不唯一的行

如果您只想自动删除重复的行(保留第一行),请尝试:

sort -u --key=1,1 data.txt

答案 3 :(得分:1)

这是一个非常简单,有点粗糙的awk脚本,用于完成与您似乎描述的内容非常接近的内容:

#!/usr/bin/awk -f

{ if ($1 in seenbefore) {
    printf( "%s\t%s\n", $1, seenbefore[$1]);
    printf( "%s\t%s\n", $1, FILENAME);
    }
  seenbefore[$1]=FILENAME;
  }

正如你所希望的那样,我们所做的就是建立一个你在第一列/字段中找到的每个值的关联数组(在FS特殊块中设置BEGIN来改变输入字段separator ...用于简单的天真形式的CSV支持)。当我们遇到任何重复时,我们打印出欺骗,我们之前看到它的文件和当前文件名。无论如何,我们用当前文件的名称添加/更新数组。

使用更多代码,您可以存储和打印每个代码的行号,将文件名/行号元组附加到列表中,并将所有输出移动到END块,您可以用更简洁的格式对其进行汇总,等等。

对于任何我个人转移到数据类型更丰富的Python(实际列表和元组,而不是必须将它们连接成字符串或构建和数组阵列),我可以获得更多的权力(一个实际的CSV解析器,它可以处理各种引用的CSV和替代分隔符,并且生成排序结果非常容易)。

然而,希望这可以让你走上正确的轨道。