8

特定の列に応じて、Unixスクリプトを使用してファイルの内容を並べ替えたいと思います。

例:3番目の列で次のファイルを並べ替えます:

ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

結果は次のようになります

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds

sort -k 3,3を試しましたが、単語の3dグループ(separator = SPACE)でソートするだけです。

UNIXソートを好きなように動作させる方法はありますか、それとも別のツールを使用する必要がありますか?

4

5 に答える 5

11
$ sort --key=1.3,1.3 inputfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds

ある種のマニュアルページ:

[...]

-k、-key = POS1 [、POS2]

POS1(オリジン1)でキーを開始し、POS2(デフォルトの行末)でキーを終了します

[...]

POSはF[.C][OPTS]です。ここで、Fはフィールド番号、Cはフィールド内の文字位置です。どちらも原点1です。-tも-bも有効になっていない場合、フィールド内の文字は前の空白の先頭からカウントされます。OPTSは、1つ以上の単一文字の順序付けオプションであり、そのキーのグローバル順序付けオプションをオーバーライドします。キーが指定されていない場合は、行全体をキーとして使用します。

--key = 1.3,1.3の場合、フィールドは1つ(行全体)であり、このフィールドの3番目の文字の位置を比較していると言いました。

于 2012-10-01T14:53:00.070 に答える
4

並べ替える前にsedを使用して列を作成します

$ echo "ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb" | sed 's/\(.\)/\1 /g' | sort -t ' ' -k3,3 | tr -d ' '

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
于 2012-09-12T08:12:01.543 に答える
2
cat inputfile | perl -npe 's/(.)/ $1/g' | sort -k 3,3 | perl -npe 's/ //g'
于 2012-09-12T08:14:47.577 に答える
1

私は直接perlに固執し、コンパレーターを定義します

echo $content | perl -e 'print sort {substr($a,3,1) cmp substr($b,3,1)} <>;'
于 2012-09-12T08:20:02.960 に答える
0

線分がキーとして使用される前に1つ以上のスペースがある行でも同じ問題が発生しました。並べ替えるテキストにフィールドセパレータが存在しないと、行全体が1つのフィールドになるため、次のように使用できます。

sort -n -t\| -k1.3,1.3 inputfile
于 2022-01-31T20:32:38.920 に答える