我想在我的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
检查是否仍然在每一行进行评估?
修改 所以,只是为了明白为什么我试图按照我的方式去做。
答案 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