如何理解命令 awk '{for(x=1;$x;++x)print $x}'?

如何理解命令 awk '{for(x=1;$x;++x)print $x}'?

我知道这个命令

awk '{for(x=1;$x;++x)print $x}' 

将打印出一行中的所有列。

这不会++x 改变x为2,从而$2首先打印吗?据我了解,基于此:https://stackoverflow.com/questions/1812990/incrementing-in-c-when-to-use-x-or-x

$x其作用是什么for(x=1;$x;++x)

答案1

不。这for(i=0;i<10;i++)是一个经典的编程结构(参见传统的 for 循环)存在于许多语言中。它可以分解为:

start-expression; end-condition; end-of-iteration-expression

换句话说,我上面写的意思是“将 i 初始化为 0,当 i 小于 10 时,做一些事情,然后然后将 i 加 1。是的,语法令人困惑,但事实就是如此。end-of-iteration-expression(++x在本例中) 在每个循环结束时执行一次。它相当于写:

while(i<10){print i; ++i}

至于$x,我相信只是检查该数字的字段是否存在并且其内容不会评估为 false (如 Mathias 中所解释的回答如下)。$N如果字段号 N 存在且不是 的类型false,则返回 true。例如:

$ echo "a b c d" | awk '($4){print "yes"}'
yes
$ echo "a b c d" | awk '($14){print "yes"}' ## prints nothing, no $14
$ echo "a b c 0" | awk '($4){print "yes"}' ## prints nothing, $4 is 0

正如您在上面看到的,第一个命令会打印,yes因为有一个$4.由于没有$14,第二个不打印任何内容。所以,回到原来的例子:

awk '{for(x=1;$x;x++)print $x}' 
          ___ __ ___
           |   |  |
           |   |  |-----> increment x by 1 at the end of each loop.
           |   |--------> run the loop as long as there is a field number x
           |------------> initialize x to 1

答案2

由于 terdon 提供了全面的答案,我只想补充一点,如果任何列的计算结果为 false,则 for 语句将结束循环,如您在本示例中看到的:

$ echo 1 2 3 4 5 0 6|awk '{for(x=1;$x;++x)print $x}' 
1
2
3
4
5

答案3

  1. ++xx++单独使用时,它们在功能上是等效的。正如您引用的 Stack Overflow 问题中所讨论的,

    • 可能有表现(即时间)差异。
    • something = ++x; 和的结果something = x++;是不同的 - 但你的例子并没有这样做。

    因此,就递增而言x,您的示例相当于

    awk '{for(x=1;$x;x++) 打印 $x}'
    
  2. 独立$x相当于$x != "",因此循环将迭代,直到遇到空白字段。这是 的惰性快捷方式x <= NF,其中NF是当前记录(行)中的字段数。就您的示例而言,这是无害的,AFAICT。但是,如果您指定非默认字段分隔符,

    awk -F, '{for(x=1;$x;++x) print $x}'
    

    这将尝试执行与您的示例相同的操作,但以逗号分隔行。如果你输入a b,它就会输出a b。如果您键入a,b,它将在单独的行上打印a和。b但是如果你输入a,,b,它会输出a然后停止,因为$2是 null 。

相关内容