Awk根据匹配或不匹配输出两个文件



在下面的awk中,我试图打印出在制表符分隔的输入中匹配字符串FPRFP $2的行。如果在$2中找到匹配,那么在result中只打印file中没有这些关键字的行。与此同时,另一个文件removed被打印出来,其中包含了这些关键字。当我尝试打印两个文件时,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

elseif。您的脚本没有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

阅读Arnold Robbins的《Effective Awk Programming, 4th Edition》来学习Awk语法和语义。

顺便说一句,当编写if/else代码时,如您在问题中所示:

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

考虑你正在使用否定(!)逻辑的事实,这使得你的代码更难以理解,并且打开了潜在的双重否定。总是尝试用积极的方式表达每一个条件,在这种情况下是:

if ($2 in d) result; else removed