Unix Bash从目录文件中删除重复行?

时间:2015-12-01 12:32:06

标签: bash sorting unix directory duplicates

我有一个包含几百个txt文件的目录。我需要从每个现有文件中删除所有重复的行。整个目录中的每一行都应该是唯一的,无论它在哪个文件中,所以我需要比较和检查每个文件与另一个文件。这可能不改变现有的文件结构吗?文件名需要保持不变。

假设所有文件都在目录“foo”中,目录的总大小为30mb。

我想我可以通过comm或awk来做到这一点,但我没有找到一个可行的命令行来做这个,我不熟悉语法。

更新 我试过这行,我相信在shell中发布所有重复项,但它不是从文件中删除重复项。

awk 'NR==FNR{a[$0]="";next}; !($0 in a)' tmp/*

1 个答案:

答案 0 :(得分:1)

awk '{
   if(FNR==1){
       if(fs!=lfn && NR!=1){
         b[lfn]
       };
   lfn=FILENAME
   };
   if(!($0 in a)) {
        a[$0];print $0>FILENAME;
        fs=FILENAME
  }
  }
END{
    if(fs!=lfn){
         b[FILENAME]
    };
    for (i in b){
         close(i);
         printf (data) >i;
    }
}' tmp/* 

第一个条件:

if(!($0 in a)) {
  a[$0];print $0>FILENAME;
  fs=FILENAME
}

如果当前行$ 0在数组a中,如果没有将行添加到数组a并且正在读取当前文件,则忽略该行。 FILENAME awk内置变量给出了正在读取的文件的名称。 如果正在读取的当前文件中至少有一个不同的行被设置,则设置fs标记为FILENAME

第二个条件:

  if(FNR==1){
    if(fs!=lfn && NR!=1){
      b[lfn]
    };
     lfn=FILENAME
  }

因此,当读取下一个文件时FNR==1 fs(具有不同行的最后一个文件)和lfn(lastfilename)进行比较,如果它不同,则数组b与索引{创建{1}}。(触摸为空文件)

第一个条件:

lfn

END{ if(fs!=lfn){ b[FILENAME] }; for (i in b){ close(i); printf (data) >i; } } ,上面的条件2再次检查以查找最后一个文件是否有不同的行。还遍历数组END以触摸没有找到不同行的空文件。 在这里,我假设没有读取文件的顺序。

这是脚本不是最佳的,但会完成工作。