我有一个带有数值的排序文件,例如
foo 2.3
bar 2.6
baz 4.7
并希望有一个单行,将一行的百分位数放入最后一列,比如
foo 2.3 0.3333
bar 2.6 0.6666
baz 4.7 1.0000
谢谢你。
我有一个带有数值的排序文件,例如
foo 2.3
bar 2.6
baz 4.7
并希望有一个单行,将一行的百分位数放入最后一列,比如
foo 2.3 0.3333
bar 2.6 0.6666
baz 4.7 1.0000
谢谢你。
我假设您的意思是行数,为此您需要首先知道行数。
这是使用 awk 的两遍解决方案的一种方法:
awk 'FNR == NR { tot=NR; next } { printf( "%s %.4f\n", $0, FNR/tot) }' file file
输出:
foo 2.3 0.3333
bar 2.6 0.6667
baz 4.7 1.0000
第一个块仅在FNR == NR
第一次通过期间有效。第二块负责打印。
NR-1
开始第二遍 ( ) 时使用FNR != NR
:
awk 'FNR != NR { if(!tot) tot=NR-1; printf( "%s %.4f\n", $0, FNR/tot) }' file file
wc
在运行 awk 之前使用:
awk -v tot=$(wc -l < file) '{ printf( "%s %.4f\n", $0, FNR/tot) }' file
$ awk 'c=NR-FNR{printf "%s %.4f\n",$0,FNR/c}' file file
foo 2.3 0.3333
bar 2.6 0.6667
baz 4.7 1.0000
即使@thor 解决方案很好,也不需要遍历文件两次。相反,我们可以在内存本身内部进行。
awk '{a[NR]=$0;}END{for(i=1;i<=NR;i++)print a[i],i/NR;}' your_file
测试:
> cat temp
foo 2.3
bar 2.6
baz 4.7
> awk '{a[NR]=$0;}END{for(i=1;i<=NR;i++)print a[i],i/NR;}' temp
foo 2.3 0.333333
bar 2.6 0.666667
baz 4.7 1
如果您具体了解精度,请使用以下内容:
> awk '{a[NR]=$0;}END{for(i=1;i<=NR;i++)printf("%s %0.4f\n",a[i],i/NR);}' temp
foo 2.3 0.3333
bar 2.6 0.6667
baz 4.7 1.0000