awk,声明数组包含FNR和字段,输出

时间:2014-06-26 01:58:57

标签: arrays awk field output

我想声明一个特定行数的数组,这意味着从第10行到第78行,作为一个例子。可能是其他号码,这只是一个例子。 我的样本给了我stdout上的那一行,但是设置了#34; 1"在那两行之间。任何人都可以告诉我如何摆脱这种情况" 1"? 下面的示例应该转到stdout并包含命名行。

awk '
myarr["range-one"]=NR~/^2$/ , NR~/^8$/;
{print myarr["range-one"]};' /home/$USER/uplog.txt;

这给了我这个输出:

0
12:33:49 up 3:57, 2 users, load average: 0,61, 0,37, 0,22 21.06.2014
1
12:42:02 up 4:06, 2 users, load average: 0,14, 0,18, 0,19 21.06.2014
1
12:42:29 up 4:06, 2 users, load average: 0,09, 0,17, 0,19 21.06.2014
1
12:43:09 up 4:07, 2 users, load average: 0,09, 0,16, 0,19 21.06.2014
1

第二个问题:如何在该阵列中设置一个FNR或行的字段? 当我这样做的时候出现了我想要的领域

awk ' NR~/^1$/ , NR~/^7$/ {print $3, $11; next} ; ' /home/$USER/uplog.txt;

但我需要一个阵列,这就是我要问的原因。任何提示?提前致谢。

1 个答案:

答案 0 :(得分:0)

示例脚本的作用

awk '
myarr["range-one"]=NR~/^2$/ , NR~/^8$/;
{print myarr["range-one"]};'

你的剧本是我见过的awk中比较复杂且明显不那么明显的作品之一。我们来一个简单的输入文件:

Line  1
Line  2
Line  3
Line  4
Line  5
Line  6
Line  7
Line  8
Line  9
Line 10
Line 11
Line 12

该输出是:

0
Line  2
1
Line  3
1
Line  4
1
Line  5
1
Line  6
1
Line  7
1
Line  8
1
0
0
0
0

解析你的脚本,它似乎是第一行:

myarr["range-one"]=NR~/^2$/ , NR~/^8$/;

相当于:

myarr["range-one"] = (NR ~ /^@$/, NR ~ /^8$/) { print }

也就是说,分配给myarr["range-one"]的值在行数范围内是1,其中NR等于2并且等于8,并且在该范围之外为0;此外,当值为1时,将打印该行。

第二行:

{print myarr["range-one"]};

为每行输入打印myarr["range-one"]中的值。因此,在第一行上,打印值0。对于第2行到第8行,打印行后跟值1;对于之后的行,再次打印值0。

问题是什么

问题不明确。看来应该打印第10到78行。在awk中,基本上没有变量声明(我们可以讨论函数参数,但函数似乎没有在这里说明)。因此,声明一个数组不是一种选择。

awk -v lo=10 -v hi=78 'NR >= lo && NR <= hi { print }'

这将打印第10行和第78行之间的行。将值保存在数组中是可行的(a在下面的示例中)。所述阵列可以由NR或从0或1开始的单独索引索引:

awk -v lo=10 -v hi=78 'NR >= lo && NR <= hi { a[NR] = $0 }'   # Indexed by line number
awk -v lo=10 -v hi=78 'NR >= lo && NR <= hi { a[i++] = $0 }'  # Indexed from 0
awk -v lo=10 -v hi=78 'NR >= lo && NR <= hi { a[++i] = $0 }'  # Indexed from 1

据推测,你也有一个END块来处理数据。

原件中的分号都是不必要的。当然,空白行被忽略。