2016-09-03 63 views
0

在下面的awk我想打印出匹配的行具有字符串中的制表符分隔的输入FPRFP$2。如果在$2中找到匹配,则在result中只打印file中没有这些关键字的行。同时打印另一个文件removed,其中包含那些关键字。当我尝试打印两个文件时,awk有语法错误,如果我只打印一个awk运行。谢谢 :)。AWK输出两个文件的基础上匹配或不匹配

输入

12  aaa 
123 FP bbb 
11  ccc 
10 RFP ddd 

结果

12  aaa 
11  ccc 

除去

123 FP bbb 
10 RFP ddd 

AWK

awk -F'\t' 'BEGIN{d["FP"];d["RFP"]}!($2 in d) {print > "removed"}; else {print > "result"}' file 
awk: cmd. line:1: BEGIN{d["FP"];d["RFP"]}!($2 in d) {print > "removed"}; else {print > "result"} 
awk: cmd. line:1:              ^syntax error 

回答

4

else去与if。您的脚本没有if,只是else,因此语法错误。所有你需要的是:

awk -F'\t' '{print > ($2 ~ /^R?FP$/ ? "removed" : "result")}' file 

,或者如果你喜欢的阵列接近你要使用:

awk -F'\t' ' 
    BEGIN{ split("FP RFP",t,/ /); for (i in t) d[t[i]] } 
    { print > ($2 in d ? "removed" : "result") } 
' file 

读过书的有效AWK编程,第4版,由阿诺德·罗宾斯学习awk的语法和语义。

顺便说一句,如果写像你/别人的代码显示在你的问题时:

if (!($2 in d)) removed; else result 

想想自己在使用负(!)逻辑,这使得你的代码难于马上理解并打开你的事实直到潜在的双重否定。总是试图表达一种积极的方式每个条件,在这种情况下会是:

if ($2 in d) result; else removed 
+1

非常感谢您的帮助和解释,我只是有点'有效awk中Programming'并已开始阅读它:) – Chris