我知道这个命令
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
++x
x++
单独使用时,它们在功能上是等效的。正如您引用的 Stack Overflow 问题中所讨论的,- 可能有表现(即时间)差异。
something = ++x;
和的结果something = x++;
是不同的 - 但你的例子并没有这样做。
因此,就递增而言
x
,您的示例相当于awk '{for(x=1;$x;x++) 打印 $x}'
独立
$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 。