awk以不同的顺序打印行到原始文件

时间:2014-05-30 21:31:13

标签: awk output

我有一个包含6列的csv文件。 Col3是ID,Col4是计数。 我想打印Col3,然后将Col4转换为频率。

Col1,Col2,Col3,Col4,Col5,Col6
9,19,9,7,9,6
10,132,10,131,10,65
10.3,0,10.3,0,10.3,1
11,128,11,182,11,82

我的命令

awk -F"," '{if (NR!=1) f[$3] = $4; SUM += $4} END { for (i in f) { print i, f[i]/SUM } }' myfile.csv > myoutfile.txt

出乎意料的是,它以错误的顺序打印输出线 - 10.3出现在10之前 有没有办法解决这个问题

9,0.021875
10.3,0
10,0.409375
11,0.56875

1 个答案:

答案 0 :(得分:3)

以下是使用awk的一种方式:

awk 'BEGIN{FS=OFS=","}FNR==1{next}NR==FNR{sum+=$4;next}{print $3,(sum>0?$4/sum:0)}' file file
9,0.021875
10,0.409375
10.3,0
11,0.56875

您对文件执行两次传递。对于两个传递,我们检查如果它是第一行,我们通过执行FNR==1{next}跳过它。在第一步中,您创建一个变量sum并继续向其添加第4列值。在第二遍中,我们只打印第3列以及频率(第4列/总和)。

请注意,由于两次传球,我使用了file file。您可以使用大括号扩展并执行file{,}