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

jus*_*guy 0 awk

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

输入

12      aaa
123 FP  bbb
11      ccc
10  RFP ddd
Run Code Online (Sandbox Code Playgroud)

结果

12      aaa
11      ccc
Run Code Online (Sandbox Code Playgroud)

已移除

123 FP  bbb
10  RFP ddd
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 5

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

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

或者,如果您更喜欢使用数组方法,则尝试使用:

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

阅读Arnold Robbins撰写的《有效的Awk编程》,第4版,以学习awk语法和语义。

顺便说一句,编写类似问题的if / else代码时:

if ( !($2 in d) ) removed; else result
Run Code Online (Sandbox Code Playgroud)

考虑一下您正在使用负数(!)逻辑的事实,这使您的代码难以立即理解,并让您面临潜在的双重否定因素。始终尝试以积极的方式表达每个条件,在这种情况下,应为:

if ($2 in d) result; else removed
Run Code Online (Sandbox Code Playgroud)