对于一个简单的file
包含:
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
我使用该命令:
awk 'lines[NR]=$0 { print $lines[2]}'
它为我提供了:
1 a
b
c
d
e
f
g
h
i
j
如何以及为什么?不是吗?
2 b
另外,当我更新以下
awk '{lines[NR]=$0} END { print lines[2]}' awk.write
2 b
使用 $
j
在中awk
,您可以通过引用变量来访问它的值:
$ awk 'BEGIN {var=1; print var}'
1
有一些特殊的变量,称为字段变量,用$
符号表示,后跟数字或表达式。因此,无论$1
并且$(0+1)
给你的第一个字段的值。
在您的示例中,您创建了一个关联数组lines
,其键是行号,值是整行。要获取key的值2
,必须使用lines[2]
。使用$lines[2]
,您引用了第n个字段,其中第n个是返回的值lines[2]
。
当您处理第一行时,它lines[2]
是未初始化的,因此它可能返回0或为空或任何其他内容(该行为未由POSIX指定)。无论如何,print
并且print $0
都是一样的,这就是为什么得到的原因1 a
,这是$0
第一行。
从第二行开始,由第二行lines[2]
的内容分配,即2 b
,并且在数字上下文中2 b
返回2,您$2
从第二行获得了第二个字段的值,依此类推。
现在,由于$
不能保证after表达式返回POSIX指定的数字结果:
字段变量应以“ $”表示,后跟数字或数字表达式。未指定字段数表达式对除非负整数以外的任何值的影响;在这种情况下,未初始化的变量或字符串值无需转换为数值
因此可能会有实现被打破。至少Brian Kernighan自己的版本:
$ echo 1 2 | bawk '{print $b}'
bawk: illegal field $(), name "b"
input record number 1, file
source line number 1
在任何情况下,都可以通过添加以下表达式来强制在数字上下文中对表达式求值0
:
$ echo 1 2 | awk '{print $(b+0)}'
1 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句