用于从列中查找最小值的awk脚本

时间:2012-10-27 10:12:43

标签: awk awk-formatting

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

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

我希望在第三列值为minimu

时打印整行

7 个答案:

答案 0 :(得分:16)

这应该这样做:

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

修改

这是做什么的:

  • 记住第一行及其第三栏。
  • 对于其他行,如果第3个字段小于目前为止找到的分数,请记住该行及其第3个字段。
  • 在脚本结束时,打印该行。

请注意,可以跳过测试NR > 1,对于第1行,$3 < min将为false。如果你知道第3列总是正数(不是负数),你也可以跳过NR == 1 ...测试,因为min在脚本开头的值为零。

<强> EDIT2

这更短:

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

答案 1 :(得分:7)

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

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

结果:

1 0 141

答案 2 :(得分:3)

对此的简短回答是:

sort -k3,3n temp|head -1

因为你要求awk:

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

但我总是喜欢较短的一个。

答案 3 :(得分:1)

我认为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<x{line=$0} - 在每一行上,将第三个字段与我们存储的值进行比较,如果条件为真,则存储该行。 (我们只能在NR>1上运行,但这没关系。
  • END{print line} - 在输入结束时,打印我们存储的任何行。

你应该阅读man awk来了解这个没有意义的任何部分。

答案 4 :(得分:0)

要计算任何列中的最小值,请说最后一栏

awk&#39;(FNR == 1){a = $ NF} {a = $ NF&lt; a?$ NF:a} END {print a}&#39;

这只会打印列的最小值。如果需要完整的生产线更好地使用排序, sort -r -n -t [delimiter] -k [column] [file name]

答案 5 :(得分:0)

awk -F“;” '(NR == 1){a = $ NF; b = $ 0} {a = $ NFa?b:$ 0} END {print b}'filename

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

答案 6 :(得分:0)

awk&#39; BEGIN {OFS = FS =&#34;,&#34;} {if(a [$ 1]&gt; $ 2 || a [$ 1] ==&#34;&#34; ){a [$ 1] = $ 2;} if(b [$ 1]

||一个[$ 1] ==&#34;&#34;因为当遇到第1个字段的第1个值时,它将在[$ 1]

中为空