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

时间:2013-09-14 13:38:35

标签: linux shell awk

我有一个名为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++
   }
}

3 个答案:

答案 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