我有一个包含几百个txt文件的目录。我需要从每个现有文件中删除所有重复的行。整个目录中的每一行都应该是唯一的,无论它在哪个文件中,所以我需要比较和检查每个文件与另一个文件。这可能不改变现有的文件结构吗?文件名需要保持不变。
假设所有文件都在目录“foo”中,目录的总大小为30mb。
我想我可以通过comm或awk来做到这一点,但我没有找到一个可行的命令行来做这个,我不熟悉语法。
更新 我试过这行,我相信在shell中发布所有重复项,但它不是从文件中删除重复项。
awk 'NR==FNR{a[$0]="";next}; !($0 in a)' tmp/*
答案 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
以触摸没有找到不同行的空文件。
在这里,我假设没有读取文件的顺序。
这是脚本不是最佳的,但会完成工作。