別の列を条件とした列の値に基づいて照合を並べ替える[閉じる]

別の列を条件とした列の値に基づいて照合を並べ替える[閉じる]

私は与えられた入力データをソートしようとしてきました。データがソートされる条件です。

  • 列#1を厳密に昇順に並べ替えます。
  • 次に、列1の列2のデータを条件付きで昇順に並べ替えます。

    状態説明:

    • 列3は同じ値にグループ化する必要があります(ソートする必要はありません)。ただし、列2の最小値のソート順序を破ってはいけません。

    たとえば、

    • グループ4(列#3)の場合、col2の最小値は15882592です。 <<グループ5(列#3)の場合、最小値は15883889であるため、グループ4はグループ5より高くなければなりません。

    • 同様に、グループ5(列3)の場合、最小値は列2 15883889 <<グループ1(列3)の場合、最小値は15885010であるため、グループ5はグループ1よりも高くする必要があります。

したがって、最終的には最初にcol#1をグループ化し、次にcol#3の列#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列目の各値に4列目を追加し、2列目の最小値を追加し、4列目を2番目のソート値として使用してから再度削除します。

関連情報