2017-01-03 44 views
0

我想为我的awk脚本的BEGIN部分中的文件创建标头,但要做到这一点,我需要知道有多少个字段。我可以在主要部分进行检查以检查NR==1是否会在每一行进行评估,从而放慢速度。如何在处理之前获取AWK中的字段数

以下是我尝试使用一行代码。

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. 我希望最终文件包含头反光贴ts这两个新添加的列
+1

“BEGIN”块内不可能有 – Inian

+1

“BEGIN”出现在输入句点的处理之前。从技术上讲,文件没有多个字段(至少从awk的角度来看)只有一行。如果你想要第一行的字段数,'NR == 1'是正确的选择。 – JNevill

+0

难道你不想检查每一行的字段数? – karakfa

回答

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 

但IDK的,如果它是值得给予NR==1检查相关的的微小的性能影响到任何其他转换你将要对数据执行操作。

如果您正在考虑使用getline,请务必阅读并完全理解getline的所有含义。

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 
相关问题