Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 按字段数筛选行_Linux_Bash_Awk_Grep_Pipe - Fatal编程技术网

Linux 按字段数筛选行

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”)。每当一个包含更多或更少字段的字符串被传递到这个程序时

我在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
的任何内容,并且它会提供更好的性能。

尝试:
LC_ALL=C fgrep-f./my/patterns.txt./my/file.txt |$decoder>/path/to/result.txt
谢谢,那太神奇了,现在比以前更快了!