我有一个名为abc
的文件,其中包含10行文本和一个script.awk
文件,该文件将输出打印为要打印的行数(如tail
)。在这个例子中,它打印最后3行,但我想要一个计数器用作用户输入,即我可以运行:
$ awk -f script.awk abc <counter>
我该怎么做?
abc
skdns;avbvbkabvbakv
sad;vn;kns;anv;navvs
skdns;avbvbkabvbakv
sad;vn;kns;anv;navvs
skdns;avbvbkabvbakv
sad;vn;kns;anv;navvs
skdns;avbvbkabvbakv
sad;vn;kns;anv;navvs
skdns;avbvbkabvbakv
sad;vn;kns;anv;navvs
script.awk
{
arr[NR]=$0
}
END {
i=NR-3
while(i<NR)
{
print arr[i+1]
i++
}
}
答案 0 :(得分:2)
对于初学者,你真的想要for
循环而不是while
:
{
arr[NR]=$0
}
END {
for (i=NR-2;i<=NR;i++) {
print arr[i]
}
}
如果您不需要访问BEGIN
块中的变量,则不需要使用-v
,因此您只需执行awk -f file n=3
(任何参数传递给awk
含有=
的1}}将被视为变量)。如果未设置n
或大于文件中的数字行,则以下内容将处理:
{
arr[NR]=$0
}
END {
n=(n?n:NR)
n=(n?NR:NR:n)
for (i=NR-n+1;i<=NR;i++) {
print arr[i]
}
}
<强>演示:强>
$ seq 1 10 | awk -f script.awk n=5
6
7
8
9
10
$ seq 1 3 | awk -f script.awk
1
2
3
$ seq 1 3 | awk -f script.awk n=6
1
2
3
您应该做的最后调整是不将文件的每一行存储在内存中,只存储您需要打印的行数。您可以通过使用模数函数%
的巧妙索引来实现此目的。
答案 1 :(得分:1)
awk有一个选项'-v variable = value'选项可以从命令行设置变量。
答案 2 :(得分:1)
只需在awk脚本中执行i = NR - j
。
现在使用此命令
awk -f script.awk -v j=3 abc