【问题标题】:awk script for finding smallest value from column用于从列中查找最小值的 awk 脚本
【发布时间】:2012-10-27 10:12:43
【问题描述】:

我是AWK的初学者,所以请帮助我学习它。我有一个名为 snd 的文本文件,它的值是

1 0 141
1 2 223
1 3 250
1 4 280

我想在第三列值为最小值时打印整行

【问题讨论】:

    标签: awk


    【解决方案1】:

    应该这样做:

    awk 'NR == 1 {line = $0; min = $3}
         NR > 1 && $3 < min {line = $0; min = $3}
         END{print line}' file.txt
    

    编辑

    这是做什么的:

    • 记住第一行和它的第三个字段。
    • 对于其他行,如果第 3 个字段小于目前找到的最小值,请记住该行及其第 3 个字段。
    • 在脚本的末尾,打印该行。

    注意NR &gt; 1的测试可以跳过,第一行$3 &lt; min为假。如果您知道第 3 列始终为正数(不是负数),您也可以跳过 NR == 1 ... 测试,因为脚本开头的 min 的值为零。

    EDIT2

    这更短:

    awk 'NR == 1 || $3 < min {line = $0; min = $3}END{print line}' file.txt
    

    【讨论】:

    • awk 'NR==1 || $3 &lt; min { line = $0; min = $3}; END {print line}' file.txt
    • 是的,马克,比我快(我在你发表评论的同时进行编辑)。
    • +1。在发布我的(几乎相同的)答案之前,我不知何故错过了阅读这篇文章。
    • 感谢您的回答,它适用于仅包含两行的文本文件。不适用于多行值文件。所以请给我该代码
    【解决方案2】:

    你不需要awk 来做你想做的事。使用sort

    sort -nk 3 file.txt | head -n 1
    

    结果:

    1 0 141
    

    【讨论】:

    • +1。完美运行......除了它可能比 awk 命令占用更多资源,因为sort 需要将所有输入存储在内存中(或写入临时文件),而 awk 在更有效的管道中处理事情。跨度>
    【解决方案3】:

    我认为sort 是一个很好的答案,除非由于某种原因您正在寻找的是在更大的脚本中执行此操作的 awk 逻辑,或者您想避免额外的管道,或者这个问题的目的是为了了解更多关于 awk 的信息。

    $ awk 'NR==1{x=$3;line=$0} $3<x{line=$0} END{print line}' snd
    

    分解成碎片,这是:

    • NR==1 {x=$3;line=$0} -- 在第一行,设置一个初始值用于比较并存储该行。
    • $3&lt;x{line=$0} - 在每一行上,将第三个字段与我们存储的值进行比较,如果条件为真,则存储该行。 (我们可以只在 NR&gt;1 上运行,但这没关系。
    • END{print line} -- 在我们的输入结束时,打印我们存储的任何行。

    您应该阅读man awk 以了解其中任何不合理的部分。

    【讨论】:

    • 朋友们,你给了我从文本文件中查找最小值的代码.. 谢谢你.. 该代码仅在终端中正确执行.. 我想在 awk 程序中执行该代码.所以请帮帮我
    • 这个答案中的 awk 程序是单引号之间的部分。如果不是来自 shell,你想如何运行程序?
    • 感谢您的回答,它适用于仅包含两行的文本文件。不适用于多行值文件。所以请给我该代码
    • 我提供的代码不限于2行输入。如果您看到这种行为,那么您正在做一些奇怪的事情。但您已经选择了适合您的答案。
    • 抱歉回复晚了,我想将此命令编写为 awk 文件并在终端中执行。这意味着我希望此代码包含在 begin{} end{} 块中。我试过了像这样 BEGIN { NR==1{x=$3;line=$0} $3
    【解决方案4】:

    对此的简短回答是:

    sort -k3,3n temp|head -1
    

    因为您要求使用 awk:

    awk '{if(min>$3||NR==1){min=$3;a[$3]=$0}}END{print a[min]}' your_file
    

    但我总是更喜欢较短的。

    【讨论】:

    • 感谢您的回答,它适用于仅包含两行的文本文件。不适用于多行值文件。所以请给我该代码
    【解决方案5】:

    为了计算任何一列中的最小值,比如说最后一列

    awk '(FNR==1){a=$NF} {a=$NF < a?$NF:a} END {print a}'
    

    这只会打印列的最小值。

    如果需要完整的行最好使用sort

    sort -r -n -t [delimiter] -k[column] [file name]
    

    【讨论】:

      【解决方案6】:
      awk -F ";" '(NR==1){a=$NF;b=$0} {a=$NF<a?$NF:a;b=$NF>a?b:$0} END {print b}' filename
      

      这将打印首先遇到的具有最小值的行。

      【讨论】:

        【解决方案7】:
        awk 'BEGIN {OFS=FS=","}{if ( a[$1]>$2 || a[$1]=="") {a[$1]=$2;} if (b[$1]<$2) {b[$1]=$2;} } END {for (i in a) {print i,a[i],b[i]}}' input_file
        

        我们使用|| a[$1]=="",因为当遇到字段 1 的第一个值时,a[$1] 中的值为 null。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-06
          • 2016-06-06
          相关资源
          最近更新 更多