按字段数过滤行数

时间:2014-07-09 11:27:36

标签: 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”)。每当一个包含更多或更少字段的字符串传入此程序时,它就会崩溃,并且我收到管道错误消息。

为了解决这个问题,我在Bash中编写了一个超级简单的脚本:

while read line ; do
    if [[ $( echo $line | awk '{ print NF }') == 7 ]]; then
        echo $line;
    fi;
done

但问题是,现在需要很长时间才能完成。在需要几秒钟之前,现在需要大约30分钟。

有谁知道更好/更快的方法吗?提前谢谢。

1 个答案:

答案 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

您可以将fgrepawk合并为一个awk命令但是我不确定这是否会影响任何需要LC_ALL=C的内容并且会更好性能