无法使用awk / gawk循环多个输入文件

时间:2018-08-08 13:51:48

标签: loops awk iteration cycle

我在子文件夹中有大量文件,每个文件包含三列数字。我需要找到$ 2中最大的数字,然后打印$ 1和$ 2列。

这就是我得到的:

awk 'FNR > 1 {max=dist=0; if($2>max){dist=$1; max=$2}}END{print FILENAME "   distance: " dist "   max: " max}' ./nVT_*K/rdf_rdf_aam_aam_COM.dat

这有效,但是仅输出最后一个输入文件的值。我每个都需要一个。

使用bash for循环进行迭代会为awk部分产生“找不到命令”。我目前正在将echo循环输出输出到文件中并作为脚本运行,尽管从长远来看这不是一个可行的计划。

任何人都可以帮忙解决这个问题,以便它可以将一堆输入文件放在不同的子文件夹中,并按如下方式打印每个文件的预期结果:

./nVT_277K/rdf_rdf_aam_aam_COM.dat   distance: 4.650000   max: 1.949975
./nVT_283K/rdf_rdf_aam_aam_COM.dat   distance: 4.650000   max: 1.943047
./nVT_289K/rdf_rdf_aam_aam_COM.dat   distance: 4.650000   max: 1.907280
...
...
...

非常感谢您在此提出的任何意见。谢谢

2 个答案:

答案 0 :(得分:1)

使用GNU awk作为ENDFILE:

awk '
    FNR > 1 { if ((max=="") || ($2>max)) {dist=$1; max=$2} }
    ENDFILE { print FILENAME "   distance: " dist "   max: " max; max=dist="" }
' ./nVT_*K/rdf_rdf_aam_aam_COM.dat

使用任何awk并假设您的输入文件不为空:

awk '
    FNR==1 { if (NR>1) print fname "   distance: " dist "   max: " max; max=dist=""; fname=FILENAME; next }
    (max=="") || ($2>max) {dist=$1; max=$2} }
    END { print fname "   distance: " dist "   max: " max }
' ./nVT_*K/rdf_rdf_aam_aam_COM.dat

答案 1 :(得分:0)

假设至少有一个正值(这样我们就不需要初始化)

$ awk 'FNR==1    {f=FILENAME}
       $2>max[f] {max[f]=$2; dist[f]=$1} 
       END       {for(f in max) print f, "distance:", dist[f], "max:", max[f]}' files

最大距离和最大距离由文件名索引,因为在给定路径中必须是唯一的...