gpt4 book ai didi

linux - 将计数器参数传递给 awk 脚本

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:09 24 4
gpt4 key购买 nike

我有一个名为 abc 的文件,其中包含 10 行文本和一个 script.awk 文件,该文件将输出打印为要打印的行数(如 尾部)。在此示例中,它打印最后 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++
}
}

最佳答案

对于初学者,您确实需要一个 for 循环而不是 while:

{
arr[NR]=$0
}
END {
for (i=NR-2;i<=NR;i++) {
print arr[i]
}
}

如果您不需要访问 BEGIN block 中的变量,则不需要使用 -v 所以您只需执行 awk - f file n=3(传递给 awk 的任何包含 = 的参数都将被视为变量)。如果 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

你应该做的最后一个调整是不要将文件的每一行都存储在内存中,只存储你需要打印的行数。您可以通过使用模函数 % 的巧妙索引来实现这一点。

关于linux - 将计数器参数传递给 awk 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com