人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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も検討しましたが、あまりプログラムを組みたくないので・・・



●質問者: samasuya
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:aaa CCC ddd FFF Linux
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● mjy
●500ポイント ベストアンサー

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 にて)

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ