我在Linux中过滤非常长的文本文件(通常> 1GB),只能获得我感兴趣的那些行。我使用这个命令:
cat ./my/file.txt | LC_ALL=C fgrep -f ./my/patterns.txt | $decoder > ./path/to/result.txt
$decoder
是我为解码这些文件而提供的程序的路径。现在的问题是它只接受带有 7个字段的行,即7个用空格分隔的字符串(例如“11 22 33 44 55 66 77”)。每当一个包含更多或更少字段的字符串传入此程序时,它就会崩溃,并且我收到管道错误消息。
为了解决这个问题,我在Bash
中编写了一个超级简单的脚本:
while read line ; do
if [[ $( echo $line | awk '{ print NF }') == 7 ]]; then
echo $line;
fi;
done
但问题是,现在需要很长时间才能完成。在需要几秒钟之前,现在需要大约30分钟。
有谁知道更好/更快的方法吗?提前谢谢。
答案 0 :(得分:1)
也许你可以在它之间插入awk
。无需依赖Bash:
LC_ALL=C fgrep -f ./my/patterns.txt ./my/file.txt | awk 'NF == 7' | "$decoder" > ./path/to/result.txt
也许awk
可以成为首发。性能可能更好:
awk 'NF == 7' ./my/file.txt | LC_ALL=C fgrep -f ./my/patterns.txt | "$decoder" > ./path/to/result.txt
您可以将fgrep
和awk
合并为一个awk
命令但是我不确定这是否会影响任何需要LC_ALL=C
的内容并且会更好性能