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 特别论坛。
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)