如何在处理之前获取AWK中的字段数

时间:2017-01-03 18:30:32

标签: awk

我想在我的awk脚本的BEGIN部分为文件创建一个标题,但要做到这一点,我需要知道有多少字段。我可以在主要部分中检查是否NR==1但是会​​在每一行上进行评估,从而减慢速度。

以下是我尝试使用单线程。

fields.txt

a   1
b   2
c   3

结果:

awk 'NR==1{a=NF; print "before begin, there are ", a, "fields"}BEGIN{print "there are ", a, "fields"}{print a"\t"$0}END{print "there were", a, "fields"}' fields.txt
there are   fields
before begin, there are  2 fields
2   a   1
2   b   2
2   c   3
there were 2 fields

我猜BEGIN块仍然在前一个块之前被评估。我是否真的完成了目标,或者NR==1检查是否仍然在每一行进行评估?

修改 所以,只是为了明白为什么我试图按照我的方式去做。

  1. 我有一个说100k行和40列的文件
  2. 此文件是管道中另一个进程的输出,其中awk脚本是最后一步
  3. 我正在根据其他行计算两行并将这些行添加到输出
  4. 我希望最终文件包含一个反映两个新添加列的标题

2 个答案:

答案 0 :(得分:3)

听起来这就是你正在尝试做的事情:

awk '
  BEGIN {if ((getline < ARGV[1]) > 0) a=NF; print "there are", a, "fields"}
  {print a"\t"$0}
  END {print "there were", a, "fields"}
' file
there are 2 fields
2       a   1
2       b   2
2       c   3
there were 2 fields

但如果NR==1支票相对于您要对数据执行的其他任何转换产生微小的性能影响,那么我认为这是值得的。

如果您正在考虑使用http://awk.freeshell.org/AllAboutGetline,请务必阅读并完全理解使用getline的所有影响。

答案 1 :(得分:2)

我不确定awk对每一行进行NR==1检查是否真的会慢下来。如果这确实是一个问题,那么可能在当前awk脚本之外进行初始字段计数,并将其发送到带有变量的awk脚本中。类似的东西:

fieldCount=`head -1 fields.txt | awk '{print NF}'`
awk -v a="$fieldCount" 'BEGIN{print "there are ", a, "fields"}{print a"\t"$0}END{print "there were", a, "fields"}' fields.txt