fgrep:将结果排序为文件

时间:2014-07-01 08:37:14

标签: shell grep pipe

我即将学习一些shell脚本,我真的很想用frgep的结果来获得我想要的东西。是否有办法将fgrep的结果传递给文件,方式是将每个模式保存到仅包含属于这些模式的行的文件中。

我的输入文件如下:

@ABC;123;bc=Pattern_1;
@DEF;456;bc=Pattern_1;
@ZYR;678;bc=Pattern_2;
@OPZ;888;bc=Pattern_2;

我用于模式搜索的文件如下:

Pattern.txt:
Pattern_1
Pattern_2
Pattern_3

现在我做一个fgrep(每个条目我还需要以下3行):

fgrep -A 3 -f Pattern.txt huge_file

完美无缺。但我希望将结果排序到文件中。意味着包含Pattern_1的每一行都应该在结果文件中,例如Pattern_1.txt。其他模式以相同的方式(pattern_2行应该以pattern_2.txt结束,依此类推)。

Pattern_1.txt:
ABC Pattern_1 123
DEF Pattern_1 456
...

Pattern_2.txt:
ZYR Pattern_2 678
OPZ Pattern_2 888
...

原则上我可以为每个模式进行for循环,并且每次都执行fgrep并将结果保存到文件中。但是有更优雅的方法可以在许多文件中动态传输fgrep的结果,具体取决于模式。它是相关的,因为包含模式的文件很大,并且运行fgrep需要一段时间。 这可能吗?我在管道之后使用if子句玩了arround,但是我无法获得正确的语法来做我想做的事情。这可能吗?

感谢。 卡斯滕

1 个答案:

答案 0 :(得分:0)

这是一个我认为可以满足你所需要的一个班轮。

awk 'NR==FNR{a[$1]}{for(i in a){if(i==$2)print $0 >> $2}}' Pattern.txt hugefile

这应该适用于更新的规格,没有时间让它看起来不错。

awk -F";" 'NR==FNR{a[$0]}{for(i in a){if(i==substr($3,4))print substr($1,2),substr($3,4),$2 >> substr($3,4)}}' Pattern.txt hugefile

略有减少

awk -F";" 'NR==FNR{a[$0]}{x=substr($3,4);for(i in a){if(i==x)print substr($1,2),x,$2 >> x}}' Pattern.txt hugefile