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

时间:2016-09-03 18:06:01

标签: 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

1 个答案:

答案 0 :(得分:4)

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,第4版,以学习awk语法和语义。

在编写if / else代码时,如你在问题中显示的那样:

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

了解您使用否定(!)逻辑的事实,这会使您的代码难以立即理解并打开潜在的双重否定。始终尝试以积极的方式表达每一个条件,在这种情况下,这将是:

if ($2 in d) result; else removed