【问题标题】:Determining NR within BEGIN section of awk script在 awk 脚本的 BEGIN 部​​分中确定 NR
【发布时间】:2019-02-09 01:43:14
【问题描述】:

在 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”是我的输入文件的名称....

【问题讨论】:

  • 您的输入始终是文件还是来自管道的流?

标签: bash awk


【解决方案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。它的好处是它不会占用文件的第一行。

【讨论】:

  • 管道到“getline n”不起作用。我收到以下错误...".sh: 1: 0: not found"
  • 抱歉错字。我漏掉了一个空格
【解决方案2】:

你也可以这样做

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

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

【讨论】:

    【解决方案3】:

    awk 的另一种方式:

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

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

    【讨论】:

      【解决方案4】:

      考虑到您的输入始终是文件而不是流,最有效和最简洁的方法是在脚本外部调用 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
      

      【讨论】:

        猜你喜欢
        • 2015-03-02
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2015-06-01
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        相关资源
        最近更新 更多