我即将学习一些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,但是我无法获得正确的语法来做我想做的事情。这可能吗?
感谢。 卡斯滕
答案 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