1

我有一个带有数值的排序文件,例如

foo 2.3
bar 2.6
baz 4.7

并希望有一个单行,将一行的百分位数放入最后一列,比如

foo 2.3 0.3333
bar 2.6 0.6666
baz 4.7 1.0000

谢谢你。

4

3 回答 3

2

我假设您的意思是行数,为此您需要首先知道行数。

这是使用 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
于 2013-01-16T10:01:17.877 回答
2
$ 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
于 2013-01-16T17:22:33.767 回答
1

即使@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
于 2013-01-16T13:42:03.637 回答