今、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も検討しましたが、あまりプログラムを組みたくないので・・・
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 にて)
あー!すばらしい!ソート用のキーを追加するんですね、なるほどです!
ありがとうございます!!!!!!!!!