6

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

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

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

4

7 回答 7

19

这应该这样做:

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

编辑

这是做什么的:

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

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

编辑2

这更短:

awk 'NR == 1 || $3 < min {line = $0; min = $3}END{print line}' file.txt
于 2012-10-27T12:05:52.933 回答
8

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

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

结果:

1 0 141
于 2012-10-27T10:25:10.927 回答
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

但我总是更喜欢较短的。

于 2012-10-29T07:32:56.447 回答
2

我认为这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以了解其中没有意义的任何部分。

于 2012-10-28T04:35:41.880 回答
0

为了计算任何列中的最小值,假设最后一列

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

这只会打印列的最小值。

如果需要完整的线路,最好使用sort

sort -r -n -t [delimiter] -k[column] [file name]
于 2015-12-01T00:43:50.247 回答
0
awk -F ";" '(NR==1){a=$NF;b=$0} {a=$NF<a?$NF:a;b=$NF>a?b:$0} END {print b}' filename

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

于 2015-12-01T01:03:04.167 回答
0
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 的第一个值时,它的 in 将为 null a[$1]

于 2016-11-22T22:09:14.120 回答