【问题标题】:AWK print matching string with if-then and AND/OR operatorsAWK 使用 if-then 和 AND/OR 运算符打印匹配字符串
【发布时间】:2020-02-07 08:34:25
【问题描述】:

想法:读取管道分隔的输入文件,根据多个字段匹配条件从每个输入行打印多个字段。

输入样本:

Game1=BasketBall|Game2=BaseBall|Game3=RaquetBall
Game5=MMA|Game2=Judo|Game6=Boxing
Game1=Horseplay|Game2=CouchSurfing|Game7=Texting

逻辑:打印以 Game1 和 Game2 作为键名的所有“Key=Value”对的逗号分隔列表。

输出样本:

Game1=BasketBall, Game2=BaseBall
Game2=Judo
Game1=Horseplay,Game2=CouchSurfing

我无法从以下命令获得任何结果:

cat 20200109.txt | awk -F"|" '{ for(i=0;i<=NF;i++) {if ($i ~ /Game1=/ || $i ~ /Game2=/ ) {print $i} } }' > output.txt

【问题讨论】:

    标签: awk


    【解决方案1】:

    首先要记住字段编号从 1 开始,所以相应地更改你的 for 循环:

    awk -F"|" '{ for(i=1;i<=NF;i++) {if ($i ~ /Game1=/ || $i ~ /Game2=/ ) {print $i} } }'
    

    这样你就得到了:

    Game1=BasketBall
    Game2=BaseBall
    Game2=Judo
    Game1=Horseplay
    Game2=CouchSurfing
    

    这很接近。要避免每次匹配后换行,请改用 printf:

     $ awk -F"|" '{ comma=""; for(i=1;i<=NF;i++) {if ($i ~ /Game1=/ || $i ~ /Game2=/ ) {printf "%s%s", comma, $i; comma=","} } print ""}' file
     Game1=BasketBall,Game2=BaseBall
     Game2=Judo
     Game1=Horseplay,Game2=CouchSurfing
    

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 2012-02-22
      • 2013-10-13
      • 2019-04-02
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多