Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用awk获取文件中行的百分比_Unix_Awk_Statistics_Percentile - Fatal编程技术网

Unix 使用awk获取文件中行的百分比

Unix 使用awk获取文件中行的百分比,unix,awk,statistics,percentile,Unix,Awk,Statistics,Percentile,我有一个带有数字值的排序文件,如 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) }' f

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

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之前使用wc:

awk -v tot=$(wc -l < file) '{ printf( "%s %.4f\n", $0, FNR/tot) }' file

我假设你指的是行数的百分比,为此你需要先知道行数

这里有一种方法可以将其作为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之前使用wc:

awk -v tot=$(wc -l < file) '{ printf( "%s %.4f\n", $0, FNR/tot) }' file

即使@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

即使@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

非常感谢。它通常会执行此任务,但%的行输出到第一列时没有分隔空间。@MarioKonschake:它与gawk和nawk一起工作,您使用的是哪个版本的awk?在您的文件上运行命令dos2unix。看起来它包含^Mcharacters@sarathi那么这是正确的方法,因为您无法在数组中存储那么多数据。+1用于该方法,但您可以替换FNR==NR{tot=NR;next}或者类似于任何脚本中的just tot=NR-FNR,您只想在第二次通过时处理文件,并计算文件中的行数。谢谢。它通常会执行此任务,但%的行输出到第一列时没有分隔空间。@MarioKonschake:它与gawk和nawk一起工作,您使用的是哪个版本的awk?在您的文件上运行命令dos2unix。看起来它包含^Mcharacters@sarathi那么这是正确的方法,因为您无法在数组中存储那么多数据。+1用于该方法,但您可以替换FNR==NR{tot=NR;next}或者类似于任何脚本中的just tot=NR-FNR,您只想在第二次传递时使用文件中的行数计数来处理文件。