在下面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
答案 0 :(得分: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
阅读Arnold Robbins撰写的Effective Awk Programming,第4版,以学习awk语法和语义。
在编写if / else代码时,如你在问题中显示的那样:
if ( !($2 in d) ) removed; else result
了解您使用否定(!
)逻辑的事实,这会使您的代码难以立即理解并打开潜在的双重否定。始终尝试以积极的方式表达每一个条件,在这种情况下,这将是:
if ($2 in d) result; else removed