5

UNIXソートでいくつかのデータをソートする必要がありますが、正確に正しい構文を理解できません。データは次のようになります。

3.9.1 Step 10:
3.9.1 Step 20:
3.8.10 Step 20:
3.10.2 Step 10:
3.8.4 Step 90:
3.8.4 Step 100:
3.8.4 Step 10:

最初にメジャー番号、次にステップ番号を使用して並べ替えたいと思います。たとえば、上記で並べ替えたデータは次のようになります。

3.8.4 Step 10:
3.8.4 Step 90:
3.8.4 Step 100:
3.8.10 Step 20:
3.9.1 Step 10:
3.9.1 Step 20:
3.10.2 Step 10:

このサイトで最初の番号で並べ替える方法を見つけました。

sort -t. -k 1,1n -k 2,2n -k 3,3n

しかし、私は今、最初の並べ替えを邪魔することなく、3列目のステップ番号で並べ替えるのに苦労しています

4

4 に答える 4

2

これはあなたのために働くかもしれません:

 sort -k3,3n file | sort -nst. -k1,1 -k2,2 -k3,3

または非常に疑わしい:

 sort -nt. -k1,1 -k2,2 -k3,3 -k3.7 file

最初の例では、次の 2 つの並べ替えを使用します。

  1. sort -k3,3n段階ごとに並べ替えます
  2. sort -nst. -k1,1 -k2,2 -k3,3主要な番号でソートしますが、ステップ順は保持します

2 番目は機能しますが、3 番目のメジャー番号が 100 未満のままである場合に限ります。

多分:

sed 's/ /./2' file | sort -nt. -k1,1 -k2,2 -k3,3 -k4,4 | sed 's/\./ /3'
于 2012-07-12T04:02:55.657 に答える
2

Unix の再設計に関する魅力的な記事がありますsort('Theory and Practice in the Construction of a Working Sort Routine'、JP Linderman、AT&T Bell Labs Tech Journal、1984 年 10 月)。これは、残念ながらインターネット AFAICT ( 1 年ほど前に調べたのですが、見つかりませんでした。ちょうど今もう一度調べたところ、参照先は見つかりましたが、記事自体は見つかりませんでした)。とりわけ、この記事は、Unixsortの場合、比較時間がデータ移動のコストをはるかに上回ることを示しました (比較で行ごとに決定されたフィールドを比較する必要があることを考えると、それほど驚くことではありませんが、「データ」の移動は単に切り替えの問題です)ポインター)。その結果の 1 つは、 danfuzzを行うことを推奨しているということです。提案します。キーをマッピングして比較を容易にします。彼らは、単純なスクリプト化されたソリューションでさえ、ソート作業を非常に困難にするよりも時間を節約できることを示しました.

そのため、データ ファイルに自然に現れる可能性が低い文字 ( などControl-A) をキー フィールド区切り文字として使用するという観点から考えることができます。

sed 's/^\([^.]*\)[.]\([^.]*\)[.]\([^ ]*\) Step \([0-9]*\):.*/\1^A\2^A\3^A\4^A&/' file |
sort -t'^A' -k1,1n -k2,2n -k3,3n -k4,4n |
sed 's/^.*^A//'

最初のコマンドは難しいものです。4 つの数値フィールドを識別し、それらを選択した文字 (^A上記のように入力Control-A) で区切って出力し、元の行のコピーを出力します。次に、並べ替えは最初の 4 つのフィールドで数値的に機能し、最後のsedコマンドは最後の までの各行の先頭を取り除き、Control-A元の行に戻します。

于 2012-07-12T02:32:12.760 に答える
2

途中のStepandを に変身させて、その後に変身させたらどうですか?これにより、あなたが探している結果が得られると思います::sort

cat your-file.txt \
    | sed -e 's/ Step \(.*\):$/.\1/g' \
    | sort -t. -k1,1n -k2,2n -k3,3n -k4,4n \
    | sed -e 's/\(.*\)\.\(.*\)$/\1 Step \2:/g'

catここでは説明目的で使用しています。通常のファイルの場合は、最初の に渡すことができますsed。)

于 2012-07-12T01:57:26.960 に答える
1

更新:

これにより、指定した出力が生成されます。

sed 's/Step /Step./' data|sort -t. -n -k1,1 -k2,2 -k3,3 -k4|sed 's/Step./Step /'

結果:

3.8.4 Step 10:
3.8.4 Step 90:
3.8.4 Step 100:
3.8.10 Step 20:
3.9.1 Step 10:
3.9.1 Step 20:
3.10.2 Step 10:

この並べ替えの課題は、並べ替えフィールドが'.'(バージョン番号の場合) と既定の空白 (ステップ番号の場合) の両方で定義されていることです。同じ並べ替えコマンドに複数の/異なるフィールド セパレータを指定することはできません。複数の並べ替えを異なるフィールド セパレータと組み合わせても、正しい出力が得られませんでした。

この解決策は、すべての並べ替えフィールドを同じ文字 ( ) で区切ることができるように、Stepフィールドの後の空白を一時的にに置き換えることで機能します。並べ替えが完了すると、は再び空白に置き換えられます。'.''.''.'

于 2012-07-12T03:10:23.573 に答える