我有两列如下
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
答案 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;