我有一个包含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
答案 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{,}