awk在列之间进行数学运算

时间:2015-04-15 18:42:04

标签: awk

我希望从多行记录文件中过滤第二列中的最高分。我的方法就像:

awk ' BEGIN { RS=""; FS="\n"} {$2==max}  {print $2}' file

样本看起来像

104 9

110 8
111 5

116 6
117 7

130 11
131 16
132 15
133 10
134 6

146 8
147 8
148 8

但我被第二行抓住了,因为RS ="&#34 ;; FS =" \ n" 。所以我的问题是,如何将多行记录字段拆分为子字段以进行最小 - 最大数学运算?

结果应该如下:

 5
 6
 6 
 7
 8
 8
 8
 8
 9
 10
 11
 15
 16

2 个答案:

答案 0 :(得分:3)

您没有显示任何预期的输出,所以这是猜测,但这可能是您想要的:

$ cat tst.awk
BEGIN { RS=""; FS="\n" }
{
    for (i=1;i<=NF;i++) {
        split($i,a,/ /)
        max = ( (i==1) || (a[2] > max) ? a[2] : max )
    }
    print max
}
$ awk -f tst.awk file
9
8
7
16
8

答案 1 :(得分:1)

我可能不会担心弄乱RSFS这个问题。沿着这些方向的东西可能更容易:

awk 'BEGIN { max = -10000000 } NF == 2 { if ($2 > max) max = $2 } NF < 2 { print max; max = -10000000 }' file

如果文件末尾不是空行,您可能需要添加END { print max }子句以获取最后一组的输出...