Linux 按字段数筛选行
我在Linux中过滤很长的文本文件(通常大于1GB),只获取我感兴趣的行。我使用以下命令:Linux 按字段数筛选行,linux,bash,awk,grep,pipe,Linux,Bash,Awk,Grep,Pipe,我在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”)。每当一个包含更多或更少字段的字符串被传递到这个程序时
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
的任何内容,并且它会提供更好的性能。尝试:LC_ALL=C fgrep-f./my/patterns.txt./my/file.txt |$decoder>/path/to/result.txt
谢谢,那太神奇了,现在比以前更快了!