Linux の sort コマンドで特定のフィールド「のみ」でソートする方法教えてください。


今、mycsvというファイルに

aaa,bbb,ccc,ddd
aaa,eee,ccc,ddd
aaa,zzz,yyy,xxx
aaa,fff,ccc,aaa
aaa,bbb,ccc,bbb

というデータが入っていますが、

sort -t, -k3 mycsv

とすると3番目と4番目がソートされた形、

aaa,fff,ccc,aaa
aaa,bbb,ccc,bbb
aaa,bbb,ccc,ddd
aaa,eee,ccc,ddd
aaa,zzz,yyy,xxx

が結果として表示されます。

sort -t, -k3,3 mycsv

とすると、3番目を第一キーにして、1番目、2番目でソートされた形

aaa,bbb,ccc,bbb
aaa,bbb,ccc,ddd
aaa,eee,ccc,ddd
aaa,fff,ccc,aaa
aaa,zzz,yyy,xxx

が結果として表示されます。
求める形は、

aaa,bbb,ccc,ddd
aaa,eee,ccc,ddd
aaa,fff,ccc,aaa
aaa,bbb,ccc,bbb
aaa,zzz,yyy,xxx

なのですが、これを結果として出すにはどうしたらよいのでしょうか?

sortコマンドでは無理ですか?
できれば、sortコマンドでやりたいのですが、他に何か良い方法あればそちらでも結構です。

#一応、perlも検討しましたが、あまりプログラムを組みたくないので・・・

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/04/01 18:18:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:mjy No.1

回答回数70ベストアンサー獲得回数22

ポイント500pt

Sunのマニュアル(http://docs.sun.com/app/docs/doc/819-1210/sort-1?a=view)によれば「sort で、等しいキーを持つ行の相対的な順序が保存されるという保証はありません。」ということなので、sortだけではできません。(できたとしても、偶然の結果なのだと思います)

以下は、多少手数をかけた例です。


awk -F, -vOFS=, '{print $3,sprintf("%010g",NR),$0}' mycsv |sort |cut -d, -f3-

# 解説

1. 先頭に2つのフィールドを追加する(awk にて)

まず、第3フィールドを先頭に挿入します。その次に行番号を入れます。

<元ファイルの第3フィールド>,<元ファイルの行番号(sortするので桁数に注意)>,<元ファイルの行>

こうすることで、第3フィールドをが等しい行同士は元の順序(行番号)で sort されるようになります。


2. sort する

3. 一時的に追加した先頭の2つのフィールドを削除(cut にて)

id:samasuya

あー!すばらしい!ソート用のキーを追加するんですね、なるほどです!

ありがとうございます!!!!!!!!!

2009/04/01 18:17:40

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません