私は与えられた入力データをソートしようとしてきました。データがソートされる条件です。
- 列#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番目のソート値として使用してから再度削除します。