【问题标题】:Fail to cycle multiple input files with awk/gawk无法使用 awk/gawk 循环多个输入文件
【发布时间】:2018-08-08 13:51:48
【问题描述】:

我在子文件夹中有大量文件,每个文件包含三列数字。我需要在 $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 部分生成“找不到命令”。我目前正在将回显的 for 循环输出传输到文件并作为脚本运行,尽管从长远来看这不是一个可行的计划。

任何人都可以帮忙折腾一下,这样它就可以在不同的子文件夹中获取一堆输入文件,并从每个文件中打印出预期的结果:

./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
...
...
...

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

【问题讨论】:

    标签: loops awk iteration cycle


    【解决方案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
    

    【讨论】:

    • 谢谢 Ed,这正是我所需要的,它在使用“Mac”和 GNU awk 版本时同样有效。我将剖析代码并找出我出错的地方。可能是昨天办公室的 34°C 温度让逻辑思考变得有些困难。
    • 第一个脚本实际上无法在 Mac 上运行,除非 Mac 运行 GNU awk。它不适用于 OSX/BSD awk,因为 ENDFILE 是 GNU awk 扩展,它不是 POSIX 规范的一部分。我添加了一个适用于任何 awk 的版本。
    • 好吧,我没想到它也能运行(之前遇到过 END/ENDFILE 问题),但令我惊讶的是,使用“awk”或“gawk”运行命令会产生相同的结果而没有报告错误。
    • 您不会收到错误报告,因为ENDFILE 对任何非 gawk 来说只是一个未初始化的变量,因此值零或空值在上下文中评估为错误条件我的第一个脚本,所以它不会产生任何输出。您可以将 ENDFILE 替换为 AARDVARK 并使用非 GNU awk 获得相同的结果。
    • 你知道吗,我不能告诉你为什么或如何它确实有效,我是一个快乐的 awk n00b。您度过了一个美好的周末,再次感谢您为我节省了几个小时的工作
    【解决方案2】:

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

    $ 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
    

    max 和 distance 由文件名索引,因为在给定路径中必须是唯一的...

    【讨论】:

    • 谢谢!更接近虽然不正确,但这确实会迭代所有输入文件并且输出看起来像预期的那样,但是该函数似乎评估了错误的值,似乎是“dist”值($1)而不是“max”$2。这是输出:./nVT_331K/rdf_rdf_aam_aam_COM.dat distance: 14.950000 max: 0.983862 ./nVT_325K/rdf_rdf_aam_aam_COM.dat distance: 14.950000 max: 0.983969 ./nVT_319K/rdf_rdf_aam_aam_COM.dat distance: 14.950000 max: 0.982654 14.950000 是最后一个也是最大的 1 美元(0.000000-14.950000),当 2 美元是“最大”时,我需要 1 美元
    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2013-02-05
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多