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

awk根据匹配或不匹配输出两个文件,awk,Awk,在下面的awk中,我试图打印出在制表符分隔的输入中具有字符串FP或RFP$2的匹配行。如果在$2中找到匹配项,则在结果中,仅打印文件中没有这些关键字的行。同时,将打印另一个文件已删除,该文件的行中确实包含这些关键字。当我试图打印两个文件时,awk中有语法错误,如果我只打印一个文件,awk将运行。谢谢:) 输入 12 aaa 123 FP bbb 11 ccc 10 RFP ddd 12 aaa 11 ccc 结果 12 aaa 123 F

在下面的
awk
中,我试图打印出在制表符分隔的输入中具有字符串
FP
RFP
$2
的匹配行。如果在
$2
中找到匹配项,则在
结果
中,仅打印
文件
中没有这些关键字的行。同时,将打印另一个文件
已删除
,该文件的行中确实包含这些关键字。当我试图打印两个文件时,
awk
中有语法错误,如果我只打印一个文件,
awk
将运行。谢谢:)

输入

12      aaa
123 FP  bbb
11      ccc
10  RFP ddd
12      aaa
11      ccc
结果

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的《有效的Awk编程》第四版,学习Awk语法和语义

顺便说一句,在编写问题中显示的if/else代码时:

if ( !($2 in d) ) removed; else result
想想你正在使用否定(
)逻辑的事实,这会让你的代码很难马上理解,并让你面临潜在的双重否定。始终尝试以积极的方式表达每种情况,在这种情况下:

if ($2 in d) result; else removed

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的《有效的Awk编程》第四版,学习Awk语法和语义

顺便说一句,在编写问题中显示的if/else代码时:

if ( !($2 in d) ) removed; else result
想想你正在使用否定(
)逻辑的事实,这会让你的代码很难马上理解,并让你面临潜在的双重否定。始终尝试以积极的方式表达每种情况,在这种情况下:

if ($2 in d) result; else removed

非常感谢您的帮助和解释。。。我刚刚得到了有效的Awk编程
,并开始阅读:)非常感谢您的帮助和解释。。。我刚刚得到了有效的Awk编程,并开始阅读:)