为什么awk的OFS仅适用于第一行?

fil*_*ter 2 awk cygwin

我正在使用awk对文件进行一些简单的计算,但无法正确获得输出格式.OFS由于某种原因仅应用于第一行(即仅在BEGIN块内),而对于其他行,在字段之间插入单个空间.

输入:

title   c1  c2  c3  n
AA  14  6   3   40
BB  8   2   2   38
Run Code Online (Sandbox Code Playgroud)

Oneliner:

cat file.txt | awk -F'\t' 'BEGIN {OFS="\t"; print "Title","Freq1","Freq2","Freq3","Total"}; NR>1{printf "%s %.3f %.3f %.3f %d\n", $1, $2/$5, $3/$5, $4/$5, $5;}' > file2.txt
Run Code Online (Sandbox Code Playgroud)

我试过从BEGIN中删除标题,但这没有什么区别,也没有BEGIN{FS="\t";OFS="\t";...}.我在cygwin中使用awk.

gle*_*man 8

因为你正在使用printf你正在积极地完全避免使用OFS.如果你想要合并OFS,那就太丑了:

NR>1 {printf "%s%s%.3f%s%.3f%s%.3f%s%d\n", $1, OFS, $2/$5, OFS, $3/$5, OFS, $4/$5, OFS, $5}
Run Code Online (Sandbox Code Playgroud)

或者,不要使用printf:

NR>1 {print $1, sprintf("%.3f",$2/$5), sprintf("%.3f",$3/$5), sprintf("%.3f",$4/$5), $5}
Run Code Online (Sandbox Code Playgroud)

  • 重新评论,不,你不是.您明确指定了输出格式,逗号用于将参数与printf命令分开,以便它可以正确填充占位符. (3认同)