Linux 在bash中跨非常大的文本文件查找重复条目

Linux 在bash中跨非常大的文本文件查找重复条目,linux,bash,sh,Linux,Bash,Sh,我正在处理从数据库中提取的非常大的数据文件。我需要删除这些文件中的重复项。如果存在重复项,则它们将跨文件存在,而不是在同一文件中。这些文件包含的条目如下所示: File1 623898/bn-oopi-990iu/I Like Potato 982347/ki-jkhi-767ho/Let's go to Sesame Street .... File2 568798/jj-ytut-786hh/Hello Mike 982347/ki-jkhi-767ho/Let's go

我正在处理从数据库中提取的非常大的数据文件。我需要删除这些文件中的重复项。如果存在重复项,则它们将跨文件存在,而不是在同一文件中。这些文件包含的条目如下所示:

File1

 623898/bn-oopi-990iu/I Like Potato
 982347/ki-jkhi-767ho/Let's go to Sesame Street
 ....


File2

 568798/jj-ytut-786hh/Hello Mike
 982347/ki-jkhi-767ho/Let's go to Sesame Street
 ....

因此,即使在5个文件中,芝麻街行也可能会被删除,但至少会保留在其中一个文件中。根据目前为止我所掌握的信息,我可以执行以下
cat*| sort | uniq-cd
来给出每一条重复的行以及它们被重复的次数。但是无法获取文件名<代码>cat*| sort | uniq-cd | grep”“*不起作用。任何解决方案的想法或方法都会很棒。

扩展您的原始想法:

sort * | uniq -cd | awk '{print $2}' | grep -Ff- *

i、 e.形成输出,只打印重复的字符串,然后搜索所有文件(要从格式
-
,即stdin中搜索的内容列表),逐字(
-F
)。

沿着这些线搜索可能有用:

awk '!seen[$0] { print $0 > FILENAME ".new" } { seen[$0] = 1 }' file1 file2 file3 ...

twalberg的解决方案非常有效,但如果文件太大,可能会耗尽可用内存,因为它会在关联数组中为每个遇到的唯一记录创建一个条目。如果发生这种情况,您可以尝试一种类似的方法,即每个重复记录只有一个条目(我假设您有GNU awk,并且您的文件名为*.txt):

sort*.txt | uniq-d>dup
awk'BEGIN{while(getline<“dup”){dup[$0]=1}\
!(dup中的$0){打印>>(文件名“.new”)}\
dup中的$0{if(dup[$0]==1){print>>(FILENAME.new”);dup[$0]=0}}'*.txt

请注意,如果有许多副本,也可能会耗尽可用内存。您可以通过将
dup
文件拆分为较小的块并在每个块上运行
awk
脚本来解决此问题。

您不能直接删除数据库中的重复项吗?SQL非常擅长表达这类内容。那太好了,但我不能使用数据库。是否要将所有唯一的条目存储在新文件中?不。每个文件本身就是一个实际的DB条目。我真正需要做的是找到哪些文件包含重复的行,并从每个文件中删除除一个文件外的重复行@choroba为我提供了简单的查找重复文件的名称的功能。现在我必须找到这些文件中的行并删除它们。
sort *.txt | uniq -d > dup
awk 'BEGIN {while(getline < "dup") {dup[$0] = 1}} \
!($0 in dup) {print >> (FILENAME ".new")} \
$0 in dup {if(dup[$0] == 1) {print >> (FILENAME ".new");dup[$0] = 0}}' *.txt