Bash 基于不同第一列的所有列的最大值
如果我有两个以上的列,如何更改代码。假设数据是这样的Bash 基于不同第一列的所有列的最大值,bash,Bash,如果我有两个以上的列,如何更改代码。假设数据是这样的 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 我如何做到这一点 ofile.dat 1 40 76 2 20 98 3 34 33 4 50 100 5 3 46 通过比较第一列,我指的是每列
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
我如何做到这一点
ofile.dat
1 40 76
2 20 98
3 34 33
4 50 100
5 3 46
通过比较第一列,我指的是每列的最大值。谢谢
下面是我在一个包含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
您可以切换到更健壮的东西,如awk,而不是依赖于排序:
非常感谢。下面是ubuntu和mac上出现的一个错误。awk:BEGIN{PROCINFO[sorted_in]=@val_num_asc}{fori=2;我刚刚在一个稍旧的Ubuntu版本上尝试了这个功能,它很有效,但是…它可能只是awk版本。尝试将它翻转到gawk,因为asorti肯定是gawk函数,看看它是否让它开心。感谢指针。仍然是一样的。错误被指向>>>ifa[$1][这可能是一条死胡同,除非有更多posix合规知识的人介入发现错误。awk'BEGIN{PROCINFO[sorted_in]=@val_num_asc}{fori=2;i
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
:~$ cat test
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
:~$ 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]}}' test
1 40 76
2 20 98
3 34 33
4 50 100
5 3 46