根据一列中的值以另一列为条件对数据进行排序

根据一列中的值以另一列为条件对数据进行排序

我一直在尝试对给定的输入数据进行排序。这些就是对数据进行排序的条件。

  • 严格按升序对#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 列的最小值,使用第四列作为排序的第二个值,然后再次删除它。

相关内容