linux - 列中的最小值和最大值

标签 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

最佳答案

试试这个

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

关于linux - 列中的最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50139959/

相关文章:

linux - 找到出现的次数并将其添加到模式旁边

php - 了解 ssh2_exec() 中的 PTY 参数

linux - 在鹦鹉螺中隐藏已安装的设备

Bash:如何使用 sed 仅替换文件中的最后一次出现?

linux - terminfo 似乎在 csh 中不起作用

TOP/HTOP中Linux进程虚拟内存列

bash - 获取 HDFS 中最后更新的文件

bash - 将以数字开头的文件重命名为两位数

sed - 如何删除文件中的重复行...AWK、SED、UNIQ 不适用于我的文件

variables - AWK 传递循环变量