我在子文件夹中有大量文件,每个文件包含三列数字。我需要找到$ 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
...
...
...
非常感谢您在此提出的任何意见。谢谢
答案 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
最大距离和最大距离由文件名索引,因为在给定路径中必须是唯一的...