1

我有一个以abc10 行文本命名的以下文件和一个script.awk将输出打印为要打印的行数的文件(如tail)。在此示例中,它打印最后 3 行,但我希望将计数器用作用户输入,即我可以运行:

$ awk -f script.awk abc <counter> 

我该怎么做?

美国广播公司

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

脚本.awk

{
  arr[NR]=$0
}
END { 
   i=NR-3
   while(i<NR)
   {
       print arr[i+1]
       i++
   }
}
4

3 回答 3

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包含 an 的任何参数=都将被视为变量)。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

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

于 2013-09-14T13:48:54.370 回答
1

awk 有一个选项 '-v variable=value' 选项可以从命令行设置变量。

于 2013-09-14T13:43:30.333 回答
1

只需i = NR - j在您的 awk 脚本中执行。

现在使用这个命令

awk -f script.awk -v j=3 abc
于 2013-09-14T13:52:14.320 回答