【问题标题】:awk if/else conditions and printing last lineawk if/else 条件并打印最后一行
【发布时间】:2014-10-16 09:14:11
【问题描述】:

我的两个示例文件如下所示:

F1

Red -
Blue -
Green -

F2

Yellow +
Pink +
ColorX +

我需要 awk 脚本来打印第一行/最后一行,具体取决于 $2 Field(如果 $2 == "+" -- 打印第一行;else -- 打印最后一行)。

我设法编写了打印第一行的 awk 脚本,但是如何添加 else 以打印最后一行?

awk '{if (NR == 1 && $2 == "+") print}' F2
Yellow +

如何修改此代码以输入F1 并打印Green -

也许可以添加如下内容:awk '{if (NR == 1 && $2 == "+") print ; else {END print} }'

【问题讨论】:

    标签: awk


    【解决方案1】:

    简短的 hacky awk

    awk 'NR==($2=="+"){exit}END{print}' file
    

    如果它包含+或最后一行,这将打印第一行

    【讨论】:

      【解决方案2】:
      awk 'NR == 1 && $2 == "+" { print ; p=1 ; exit } 
           END { if (p != 1) { print $0 } }' INPUTFILE
      

      注意:这假设如果第一行不包含'+',则必须打印最后一行。

      【讨论】:

        【解决方案3】:

        要打印最后一行,您可以每次将其存储到一个变量中,然后在文件处理结束时打印最后一个值。您可以使用一个特殊的模式/条件END

        ($2 == "-") { line = $0                  }
        END         { if (line != "") print line }
        

        【讨论】:

          【解决方案4】:

          您可以使用 END 块获取它:

          awk 'NR == 1 && $2 == "+" {print $0;} {l=$0;f=$2;} END{if (f == "-"){print l;}}' F1
          

          我们将条件 NR == 1 && $2 == "+" 保留在模式块中(AWK 样式),而不是使用 if 语句。

          然后您可以添加另一个块,以保持整行(l 变量)和第二个字段(f 变量)在每个新行覆盖每个变量。因此,在 END 块中,您将在 l 中拥有最后一行的整行,在 f 中拥有最后一行的第二个字段。然后可以根据f的值打印l

          【讨论】:

            最近更新 更多