我想声明一个特定行数的数组,这意味着从第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;
但我需要一个阵列,这就是我要问的原因。任何提示?提前致谢。
答案 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块来处理数据。
原件中的分号都是不必要的。当然,空白行被忽略。