列中的最小值和最大值

时间:2018-05-02 17:02:09

标签: linux bash awk

我尝试从一列中获取最小值和最大值,但参考其他列。

这是我的输入文件

338043.75 2395256.25 36301 38676 1296
338056.25 2395256.25 36301 38677 1296
338068.75 2395256.25 36301 38678 1296
338081.25 2395256.25 36301 38679 1296
338043.75 2395256.25 36302 38676 1296
338056.25 2395256.25 36302 38677 1296
338068.75 2395256.25 36302 38678 1296
338081.25 2395256.25 36302 38679 1296
338043.75 2395256.25 36303 38676 1296
338056.25 2395256.25 36303 38677 1296
338068.75 2395256.25 36303 38678 1296
338081.25 2395256.25 36303 38679 1296
338043.75 2395256.25 36304 38676 1296
338056.25 2395256.25 36304 38677 1296
338068.75 2395256.25 36304 38678 1296
338081.25 2395256.25 36304 38679 1296
338043.75 2395256.25 36305 38676 1296
338056.25 2395256.25 36305 38677 1296
338068.75 2395256.25 36305 38678 1296
338081.25 2395256.25 36305 38679 1296

当第3列中的值相同时,目的是从第4列获得最小值和最大值。

然后我想要的输出就是这个

338043.75 2395256.25 36301 38676 1296
338081.25 2395256.25 36301 38679 1296
338043.75 2395256.25 36302 38676 1296
338081.25 2395256.25 36302 38679 1296
338043.75 2395256.25 36303 38676 1296
338081.25 2395256.25 36303 38679 1296
338043.75 2395256.25 36304 38676 1296
338081.25 2395256.25 36304 38679 1296
338043.75 2395256.25 36305 38676 1296
338081.25 2395256.25 36305 38679 1296

我已尝试过此代码,但它无法正常获取所需的输出。

awk     '               {D1=substr($3, 1, 5)
                         D2=substr($4, 6, 5)+0
                        }
         !(D1 in MIN)   {MIN[D1]=D2
                         MAX[D1]=D2
                         next
                        }
          D2 < MIN[D1]  {MIN[D1]=D2}
          D2 > MAX[D1]  {MAX[D1]=D2}
          END           {for (m in MIN) print m, MIN[m], MAX[m]}
        ' file

2 个答案:

答案 0 :(得分:1)

试试这个

awk '
    function set_min() { min[$3] = $4; min_line[$3] = $0 }
    function set_max() { max[$3] = $4; max_line[$3] = $0 }
    !($3 in min) { set_min(); set_max() }
    $4 < min[$3] { set_min() }
    $4 > max[$3] { set_max() }
    END {
        for (key in min) {
            print min_line[key]
            print max_line[key]
        }
    }
' file

答案 1 :(得分:1)

另一种看法......

$ function pick(){ sort -k3,3 -k4,4n"$2" "$1"  | awk '!a[$3]++'; }
$ cat <(pick file) <(pick file r) | sort -k3

338043.75 2395256.25 36301 38676 1296
338081.25 2395256.25 36301 38679 1296
338043.75 2395256.25 36302 38676 1296
338081.25 2395256.25 36302 38679 1296
338043.75 2395256.25 36303 38676 1296
338081.25 2395256.25 36303 38679 1296
338043.75 2395256.25 36304 38676 1296
338081.25 2395256.25 36304 38679 1296
338043.75 2395256.25 36305 38676 1296
338081.25 2395256.25 36305 38679 1296

对数据进行双向排序,并使用awk(高级uniq替换)选择第一个(分别为最小和最大)。合并结果并对键进行排序作为最后的触摸。