在下面的awk
中,我试图打印出在制表符分隔的输入中匹配字符串FP
或RFP
$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
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
阅读Arnold Robbins的《Effective Awk Programming, 4th Edition》来学习Awk语法和语义。
顺便说一句,当编写if/else代码时,如您在问题中所示:
if ( !($2 in d) ) removed; else result
考虑你正在使用否定(!
)逻辑的事实,这使得你的代码更难以理解,并且打开了潜在的双重否定。总是尝试用积极的方式表达每一个条件,在这种情况下是:
if ($2 in d) result; else removed