无法了解awk的打印阵列结果?

阿萨德

对于一个简单的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
cuonglm

在中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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解此打印结果

来自分类Dev

阵列无法正确打印

来自分类Dev

无法显示阵列结果

来自分类Dev

无法了解减法结果

来自分类Dev

无法打印结果表

来自分类Dev

C-打印阵列无法正常工作

来自分类常见问题

无法打印该程序的结果

来自分类Dev

无法打印该程序的结果

来自分类Dev

无法打印 getDay() 方法的结果

来自分类Dev

无法了解此C程序的结果

来自分类Dev

打印阵列/反向阵列

来自分类Dev

打印阵列

来自分类Dev

在最终结果之前的结果之间打印的awk脚本

来自分类Dev

在最终结果之前的结果之间打印的awk脚本

来自分类Dev

阵列无法正确打印出所有答案

来自分类Dev

无法间隔打印两个阵列中的项目

来自分类Dev

MIPS为什么我无法打印所选的阵列位置?

来自分类Dev

阵列无法正确打印出所有答案

来自分类Dev

为什么我的阵列测试代码无法打印?

来自分类Dev

awk-我无法打印到文件

来自分类Dev

无法打印正确的CUDA矩阵添加结果

来自分类Dev

R Knitr无法打印模型结果

来自分类Dev

无法打印出平均数组的结果

来自分类Dev

如何在awk中打印系统命令的结果

来自分类Dev

Bash Grep | awk并打印来自不同文件的结果

来自分类Dev

如何使用awk逐行打印其他程序的结果?

来自分类Dev

如何使用自定义标题打印awk命令的结果

来自分类Dev

如何为不同的领域用不同的颜色打印 awk 的结果?

来自分类Dev

打印阵列后换行?