使用Linux在第1列中查找每个不同值的第2列中的最大值

时间:2015-06-12 02:42:21

标签: linux bash unix awk

我有两列如下

ifile.dat
1   10
3   34
1   4
3   32
5   3
2   2
4   20
3   13
4   50
1   40
2   20

我要找的是在第1列中找到每个1,2,3,4,5的第2列中的最大值。

ofile.dat
1   40 
2   20
3   34
4   50
5   3

我发现有人使用其他程序完成此操作,例如Get the maximum values of column B per each distinct value of column A

5 个答案:

答案 0 :(得分:4)

awk似乎是此任务的主要候选人。只需遍历输入文件并保留一个由第一列值索引的数组,如果它大于当前存储的值,则存储第二列的值。在遍历结束时遍历数组以打印索引和相应的值

awk '{
    if (a[$1] < $2) {
        a[$1]=$2
    }
} END {
    for (i in a) {
        print i, a[i]
    }
}' ifile.dat

现在结果不会在第一列上以数字方式排序,但如果需要则应该很容易修复

答案 1 :(得分:1)

进行最小/最大计算时,始终使用读取的第一个值

来播种min / max变量
$ cat tst.awk
!($1 in max) || $2>max[$1] { max[$1] = $2 }
END {
    PROCINFO["sorted_in"] = "@ind_num_asc"
    for (key in max) {
        print key, max[key]
    }
}

$ awk -f tst.awk file
1 40
2 20
3 34
4 50
5 3

以上使用GNU awk 4. *来PROCINFO["sorted_in"]来控制输出顺序,请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal

答案 2 :(得分:1)

另一种方法是使用sort。 第2列的第一个数字排序减少,然后删除第1列的非唯一值,单行:

sort -n -r -k 2 ifile.dat | sort -u -n -k 1

答案 3 :(得分:0)

考虑到你的第一个字段将从1开始,如果是,那么在awk中再试一次。

awk '{a[$1]=$2>a[$1]?$2:(a[$2]?a[$2]:$2);} END{for(j=1;j<=length(a);j++){if(a[j]){print j,a[j]}}}'   Input_file

此处再添加一种方法。

sort -k1 Input_file | awk 'prev != $1 && prev{print prev, val;val=prev=""} {val=val>$2?val:$2;prev=$1} END{print prev,val}'

答案 4 :(得分:0)

在第二列中找到最大值的最简单命令是这样的

sort -nrk2 data.txt | awk&#39; NR == 1 {print $ 2}&#39;