我有一个 11gb 的单词表文件,该文件已排序,每个单词都在一行上。
我需要删除重复项和从 077 开始的行。
我想我需要同时运行 sed 和 sort -u,但我还想要实时输出(显示终端中正在发生的事情),如果可能的话,显示剩余时间。所有这些都包含在一个命令中,并且它必须能够在 ubuntu 12.10 中以最佳性能运行。
时间不是很重要,但如果有办法计算预计到达时间 (ETA),我或许可以借用我爸爸的基于 i7 的 CPU,它显然应该可以处理得更快,否则我将不得不使用较旧的 core 2 CPU。
因此,请给我完整的命令,无论是 sed/sort/awk 来执行此操作(以最优为准)。
答案1
正如您已经了解的,您需要使用sort -u
来删除所有重复的行。sort
但是不支持显示进度。
但是,您可以编写一个小脚本,从输入文件读取内容并将其输出到标准输出,同时打印进度。以下是示例:
#!/bin/bash
set -e
bytes_read=0
byte_count=$(wc -c "$1" | cut -d" " -f1)
chunk_size=500000
while read -N $chunk_size chunk
do
echo -ne "\rRead $bytes_read of $byte_count bytes [$[ 100 * bytes_read / byte_count ]%]" >& 2
echo -n "$chunk"
bytes_read=$[ bytes_read + chunk_size ]
done < "$1"
echo >& 2
您可以按如下方式使用此脚本:
./script-name input-file | sort -u > output-file
进度不会考虑sort
实际写入输出所需的时间,但这比读取输入文件所需的时间要少得多。这应该是最有效的基于 shell 的解决方案。
答案2
tee
和tail -f
都是在文件写入时跟踪操作的好命令,但都不能帮助您了解 sort 命令的预计到达时间(也不会让您看到 sort -u 背后发生的情况;只是大部分工作完成后的最终输出)
通过管道输出tee
(将同时写入“output_file”和标准输出):
sort -u input_file | tee output_file
或使用tail -f
:
sort -u input_file -o output_file &
tail -f output_file
此外:如果你的输入是预先排序的(正如你的问题所暗示的),而你想要的只是删除相邻的重复行,uniq
那么快多了(sort -u
我们的 T 恤/尾巴实际上是一种监控进度的有效方法)
uniq input_file | tee output_file