很难,我在一个文件夹中有1 / 2TB的文本文件。我想保留文本文件名而不是合并到1个文件中。
如何浏览文本文件并将每一行与其他所有文件进行比较?
删除整个目录的所有单词重复等等,直到全部完成?有些文件大38gb。
例如
textfile1.txt包含字词 电源
textfile2.txt也有 power 这个词,需要删除 等...
编辑:所有字词都是换行符。
直到完成同一目录中的所有文件。无论是在linux还是win。
答案 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
嵌套循环越多,它一次处理的单词越少,执行得越慢。