【问题标题】:awk to output two files based on match or no matchawk 根据匹配或不匹配输出两个文件
【发布时间】:2016-09-03 18:06:01
【问题描述】:

在下面的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

【问题讨论】:

    标签: awk


    【解决方案1】:

    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, 4th Edition》一书,了解 awk 语法和语义。

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

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

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

    if ($2 in d) result; else removed
    

    【讨论】:

    • 非常感谢您的帮助和解释...我刚收到Effective Awk Programming 并已开始阅读:)
    猜你喜欢
    • 2018-10-25
    • 2014-02-20
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2021-12-08
    • 2021-06-15
    相关资源
    最近更新 更多