在awk脚本的BEGIN部分中确定NR

时间:2019-02-07 22:55:28

标签: bash awk

在awk处理输入文件之前,我需要知道期望多少记录。

为了确定这一点,我在awk脚本的BEGIN段中有以下代码。...

BEGIN {

    p = ""
    j = 1

    getline             # Activates the FILENAmE variable which normally is not available in the BEGIN section of an awk script.
    n = system("wc -l " FILENAME)       # Assign the result (i.e. number of records in FILENAME) to the n variable.
    gsub(FILENAME, "|", n)      # Remove the input file name appended to the result and replace with "|" just to see what it's done!  
    print n             # See what the hell has happened.

}

我希望看到n显示记录数,但是我的输出看起来像这样。...

12 accounts12
0

“ accounts12”是我的输入文件的名称。...

4 个答案:

答案 0 :(得分:1)

system返回其退出状态(如果成功完成,则通常为0)。所以这行:

n = system("wc -l " FILENAME)

只会简单地导致wc命令的输出照常打印在屏幕上,然后将n设置为退出代码0。

这说明:

12 accounts12
0

第一行是wc的输出,第二行是n的值。

您可以尝试:

BEGIN {
    "wc -l " ARGV[1] | getline n;
    sub(ARGV[1], "|", n);
    print n;
}

这应该得到您的n。这样做的好处是不会占用文件的第一行。

答案 1 :(得分:1)

您也可以这样做

$ awk 'NR==FNR{n=NR; next} FNR==1{print n} ...' file{,}

第一轮计算记录数,第二轮打印计数并进行其余处理。

答案 2 :(得分:0)

与AWK的另一种方法:

  • 将FS设置为\ n(每行是一个字段)
  • 将RS设置为\ 0(仅一条记录)
  • 在字段上工作

    awk -F'\ n'-vRS ='\ 0''
      {
        打印NF
        对于(i = 1; i       j =拆分($ i,a,“”)
          打印“字段的nb =” j
          }
    }'infile

答案 3 :(得分:0)

鉴于输入内容,最高效,最简洁的方法始终是文件而不是流,只需在脚本外部调用wc并在脚本内部使用其输出即可:

awk -v nr="$(wc -l < file)" '{print nr, NR, $0}' file

例如:

$ seq 3 > file
$ awk -v nr="$(wc -l < file)" '{print nr, NR, $0}' file
3 1 1
3 2 2
3 3 3