根据不同的第一列查找所有列的最大值

j s*_*ith 2 awk text-processing gawk

我正在使用 Ubuntu,我有一个这样的输入文件

ifile.dat
1   10  15
3   34  20
1   4   22
3   32  33
5   3   46
2   2   98
4   20  100
3   13  23
4   50  65
1   40  76
2   20  22
Run Code Online (Sandbox Code Playgroud)

我如何实现这一目标?

ofile.dat
1   40  76
2   20  98
3   34  33
4   50  100
5   3   46
Run Code Online (Sandbox Code Playgroud)

我的意思是通过比较第一列来获得每列的最大值。谢谢。

这是我尝试过的(在具有 13 列的示例文件上)。但最高值不会以这种方式出现。

cat input.txt | sort -k1,1 -k2,2nr -k3,3nr -k4,4nr -k5,5nr -k6,6nr -k7,7nr -k8,8nr -k9,9nr -k10,10nr -nrk11,11 -nrk12,12 -nrk13,13 | sort -k1,1 -u 
Run Code Online (Sandbox Code Playgroud)

它没有用。所以一个乐于助人的人试图在下面帮助我。但是无论是在mac还是ubuntu上用gawk,我都无法运行并看到下面的错误

awk 'BEGIN{PROCINFO["sorted_in"] = "@val_num_asc"} {for(i=2;i<=NF;++i) if (a[$1][i]<$i){a[$1][i]=$i}} END{n=asorti(a, asorted); for(col1 in asorted){print col1, a[col1][2], a[col1][3]}}' input.txt 
Run Code Online (Sandbox Code Playgroud)

错误是

awk: syntax error at source line 1
 context is
    BEGIN{PROCINFO["sorted_in"] = "@val_num_asc"} {for(i=2;i<=NF;++i) if >>>  (a[$1][ <<< 
awk: illegal statement at source line 1
awk: illegal statement at source line 1
Run Code Online (Sandbox Code Playgroud)

我确实尝试删除 BEGIN 语句并使用 for 循环,但找不到运气。谢谢。

PS:我从stackoverflow得到了这个答案。所以我把它贴在这里是因为这是一个 unix/linux 特别论坛。

ste*_*ver 7

GNU datamash非常适合这样的事情:

$ datamash -sW groupby 1 max 2,3 < ifile.dat 
1   40  76
2   20  98
3   34  33
4   50  100
5   3   46
Run Code Online (Sandbox Code Playgroud)

要处理更多的列,您可以指定一个范围,例如

datamash -sW groupby 1 max 2-13 < ifile.dat 
Run Code Online (Sandbox Code Playgroud)