如何从1个文件中删除欺骗行并检查每一行与其他欺骗的同一文件夹中的所有文件?

时间:2016-08-25 12:18:37

标签: awk

很难,我在一个文件夹中有1 / 2TB的文本文件。我想保留文本文件名而不是合并到1个文件中。

如何浏览文本文件并将每一行与其他所有文件进行比较?

删除整个目录的所有单词重复等等,直到全部完成?有些文件大38gb。

例如

textfile1.txt包含字词 电源

textfile2.txt也有 power 这个词,需要删除 等...

编辑:所有字词都是换行符。

直到完成同一目录中的所有文件。无论是在linux还是win。

1 个答案:

答案 0 :(得分:1)

awk -i inplace '!seen[$0]++' *

上面使用的GNU awk 4. * for" inplace"编辑。您需要有足够的内存来复制最大的文件,并在内存中保留所有唯一字的列表。以上也假设你的"字"由于你没有告诉我们任何其他内容,因此是换行符。

如果您没有足够的内存来复制最大的文件,可以尝试以下方法:

for file in *
do
    while [ -s "$file" ]; do
        # copy the first 100 lines from "$file" into tmp
        head -n 100 "$file" > tmp

        # inplace remove the first 100 lines from "$file"
        count=$(head -100 "$file" |wc -c)
        dd if="$file" bs="$count" skip=1 of="$file"
        truncate -s "-$count" "$file"

        # somehow get a subset of words to check in tmp
        awk 'magic happens' tmp >> "${file}.new" &&
        rm -f tmp
    done
done

但是你必须弄清楚如何一次检查一组单词(例如见下文),这将是缓慢的,谨慎行事并首先备份你的文件!

如果您可以制作每个文件的副本,但不能适用所有"单词"在记忆中,你可以做一些像:

for a in {a..z}
do
   awk -v start="^$a" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' *
done

根据某些特征寻找单词组,例如以上内容查找以a开头,然后使用b等所有单词。如果这些批次太大,请添加内循环:

for a in {a..z}
do
   awk -v start="^$a$" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' *
   for b in {a..z}
   do
       awk -v start="^$a$b" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' *
   done
done

或更多(显示扩展的正则表达式模式):

for a in {a..z}
do
   awk -v start="^$a$" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' *
   for b in {a..z}
   do
       awk -v start="^$a$b$" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' *
       for c in {a..z}
       do
           awk -v start="^$a$b$c" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' *
       done
   done
done

嵌套循环越多,它一次处理的单词越少,执行得越慢。