我正在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分钟。
有人知道更好/更快的方法吗?先感谢您。
好吧,也许您可以在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
并提供更好的性能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句