【问题标题】:How to detect the last line in awk before END?如何在 END 之前检测 awk 中的最后一行?
【发布时间】:2014-10-15 16:50:24
【问题描述】:

我正在尝试连接字符串值并打印它们,但如果最后一个类型是字符串并且类型没有变化,那么连接将不会打印:

输入.txt:

String 1
String 2
Number 5
Number 2
String 3
String 3

awk:

awk '

BEGIN { tot=0; ant_t=""; }

{ 
  t = $1; val=$2;
  #if string, concatenate its value
  if (t == "String") {
    tot+=val;
    nx=1;
  } else {
    nx=0; 
  }
  #if type change, add tot to res
  if (t != "String" && ant_t == "String") {
    res=res tot;
    tot=0;
  }
  ant_t=t;
  #if string, go next
  if (nx == 1) {
    next;
  }
  res=res"\n"val;
}

END { print res; }' input.txt

当前输出:

3
5
2

预期输出:

3
5
2
6

如何检测 awk 是否正在读取最后一行,所以如果不会更改类型,它将检查它是否是最后一行?

【问题讨论】:

    标签: awk concatenation


    【解决方案1】:

    awk 逐行读取,因此无法确定它是否正在读取最后一行。 END 块可用于在到达文件末尾后执行操作。

    执行您的期望

    awk '/String/{sum+=$2} /Number/{if(sum) print sum; sum=0; print $2} END{if(sum) print sum}'
    

    将产生输出为

    3
    5
    2
    6
    

    它有什么作用?

    /String/ 选择与String 匹配的行,Number 也是如此

    sum+=$2 执行与 String 行的连接。当Number 出现时,打印sum 并重置为零

    【讨论】:

      【解决方案2】:

      可能是这样的:

      awk -v lines="$(wc -l < /etc/hosts)" 'NR==lines{print "LAST"};1' /etc/hosts
      

      如果不清楚,我正在预先计算行数(使用wc)并将其作为名为@9​​87654324@ 的变量传递给awk

      【讨论】:

        【解决方案3】:

        只需将最后一行更改为:

        END { print res; print tot;}'
        

        【讨论】:

        • 如果最后一个类型是 != String 则打印 0。
        【解决方案4】:
        awk '$1~"String"{x+=$2;y=1}$1~"Number"{if (y){print x;x=0;y=0;}print $2}END{if(y) print x}' file
        

        说明

        • y 用作boolean,如果最后一个模式是string,我会检查END 并打印总和
        • 您实际上可以使用 x 作为布尔值,就像 nu11p01n73R 那样更智能

        测试

        $ cat file
        String 1
        String 2
        Number 5
        Number 2
        String 3
        String 3
        $ awk '$1~"String"{x+=$2;y=1}$1~"Number"{if (y){print x;x=0;y=0;}print $2}END{if(y) print x}' file
        3
        5
        2
        6
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 2017-02-25
          • 2019-11-04
          相关资源
          最近更新 更多