我一直在尝试对给定的输入数据进行排序。这些就是对数据进行排序的条件。
- 严格按升序对#1 列进行排序。
现在,在第 1 列中按升序但有条件地对第 2 列中的数据进行排序。
条件说明:
- 第 3 列应按相同值分组(不需要排序)。但是,它不应中断第 2 列最小值的排序顺序。
例如:
对于 group-4(在 col#3 中),col2 中的最小值是 15882592 << group-5(在 col#3 中)最小值是 15883889;因此第 4 组应该位于第 5 组之上。
类似地,对于第 5 组(在第 3 列中),最小值在第 2 列中 15883889 << 第 1 组(在第 3 列中)最小值 15885010;因此第 5 组应该位于第 1 组之上。
所以,最后我必须首先对 col#1 进行分组,然后对 col#3 进行条件(分组)的 column#2 分组。有什么方法可以使用 awk、sed、sort 或任何其他 unix 实用程序来做到这一点吗?
输入数据:
2 15881989 6
2 15882091 6
2 15882148 6
2 15882328 6
2 15882364 6
2 15882451 8
2 15882454 8
2 15882493 8
2 15882592 4
2 15882601 4
2 15882607 4
2 15883765 4
2 15883782 4
2 15883783 4
2 15883785 4
2 15883861 4
2 15883862 4
2 15883889 5
2 15883894 5
2 15883904 5
2 15884457 5
2 15884525 5
2 15884546 4
2 15884550 4
2 15884582 4
2 15884613 4
2 15884649 4
2 15884742 4
2 15884965 4
2 15885010 1
2 15885024 1
2 15885061 4
2 15896126 4
3 15896174 4
3 15896152 4
3 15896128 3
3 15896224 3
3 15896258 3
3 15896406 3
预期输出:
2 15881989 6
2 15882091 6
2 15882148 6
2 15882328 6
2 15882364 6
2 15882451 8
2 15882454 8
2 15882493 8
2 15882592 4
2 15882601 4
2 15882607 4
2 15883765 4
2 15883782 4
2 15883783 4
2 15883785 4
2 15883861 4
2 15883862 4
2 15884546 4
2 15884550 4
2 15884582 4
2 15884613 4
2 15884649 4
2 15884742 4
2 15884965 4
2 15885061 4
2 15896126 4
2 15896128 4
2 15896152 4
2 15883889 5
2 15883894 5
2 15883904 5
2 15884457 5
2 15884525 5
2 15885010 1
2 15885024 1
3 15896128 3
3 15896224 3
3 15896258 3
3 15896406 3
3 15896152 4
3 15896174 4
谢谢,
答案1
如果您的数据位于 /tmp/test.dat 中,那么这将给出您想要的输出:
sort -k 1n,2n /tmp/test.dat \
| awk '{
if (!($1 ":" $3 in A)) {A[$1 ":" $3] = $2}
print $1, $2, $3, A[$1 ":" $3]
}' \
| sort -k 1n -k 4n -k 2n | cut -d " " -f 1-3
我为第 1 列和第 3 列的每个值添加第四列,其中第 2 列的最小值,使用第四列作为排序的第二个值,然后再次删除它。