ラベル sort の投稿を表示しています。 すべての投稿を表示
ラベル sort の投稿を表示しています。 すべての投稿を表示

2014-11-04

環境によってsortコマンドの結果が異なる件

CentOS 5からCentOS 6にリモート接続して、sortコマンドで並べ替えを行ってみたところ

CentOS 6上でsortした結果とリモート接続してsortした結果が異なってしまい嵌ったので解決策をφ(・ω・ )メモメモ

元ファイル
[centos6] $ cat /tmp/test
a
"
z
/
_

CentOS 6上でのsort結果
[centos6] $ sort /tmp/test
_
/
"
a
z

CentOS 5 -> CentOS 6へリモートコマンド実行kした際のsort結果
[centos5] $ ssh centos6 "sort /tmp/test"
"
/
_
a
z

と、いう感じで記号の並び順が異なってしまっている。

リモートコマンドで実行していることが原因なのかと思い、同一のファイルをCentOS 5上にも作成してCentOS5上でのsort結果も試してみた
[centos5] $ sort /tmp/test
"
/
_
a
z

どうやら、リモート実行だからという訳では無いようで実行元の環境に依存している雰囲気でした。

いろいろと試行錯誤してたどり着いた解決策はこれ→LC_ALL=Cをsortコマンドの前に指定してあげる

CentOS 6上でのsort結果
[centos6] $ LC_ALL=C sort /tmp/test
"
/
_
a
z

CentOS 5 -> CentOS 6へリモートコマンド実行kした際のsort結果
[centos5] $ ssh centos6 "LC_ALL=C sort /tmp/test"
"
/
_
a
z

これで無事sort結果がそろいましたヾ(*・∀・)ノ"

2013-04-04

linuxでディレクトリごとのサイズをhuman readableな単位でソートして表示する

例えば、配下のディレクトリの容量を含めず純粋にそのディレクトリに含まれているファイルの合計サイズが大きなディレクトリの上位5件を知りたい場合

普通にやってしまうと単位を考慮したソートがなされない
$ du -hS /* | sort -nr | head -5
1020K   /aaa
1020K   /bbb
1020K   /ccc
1016K   /ddd
1012K   /eee

-hオプションで単位をつけなかった場合と結果が違う
$ du -S /* | sort -nr | head -5
36643580  /vvv
4846020   /www
4198408   /xxx
3348584   /yyy
664132    /zzz
そこで、シェルスクリプトでごにょごにょしてみた
$ du -S /* | sort -nr | while read size fname; do for unit in k M G T P E Z Y; do if [ $size -lt 1024 ]; then echo -e "${size}${unit}\t${fname}"; break; fi; size=$((size/1024)); done; done | head -5
34G     /vvv
4G      /www
4G      /xxx
3G      /yyy
648M    /zzz
めでたし、めでたしヾ(*・ω・)シ

2012-08-07

linuxのsortコマンドで列(カラム)を指定してソートする

元のテキストの中身はこんな状態
cat hoge.txt 
1 1 a
3 10 c
2 2 b
オプションを何も指定せずにソートすると第一カラムを文字列としてソートする
sort hoge.txt 
1 1 a
2 2 b
3 10 c
オプションを-k 2としてソートすると、第二カラムを文字列としてソートする
sort hoge.txt -k 2
1 1 a
3 10 c
2 2 b
-nをつけてあげると数値としてソートするので2と10の順番が入れ替わる
sort hoge.txt -k 2 -n
1 1 a
2 2 b
3 10 c
第三カラムのソートの場合は-k 3でOK
sort hoge.txt -k 3
1 1 a
2 2 b
3 10 c
ヘルプの中身はこんな感じ
使用法: sort [オプション]... [ファイル]...
Write sorted concatenation of all FILE(s) to standard output.

長いオプションに必須の引数は短いオプションにも必須です.
Ordering options:

  -b, --ignore-leading-blanks  ignore leading blanks
  -d, --dictionary-order      consider only blanks and alphanumeric characters
  -f, --ignore-case       fold lower case to upper case characters
  -g, --general-numeric-sort  一般的な数値の大小によって比較
  -i, --ignore-nonprinting    表示可能文字のみを比較して 並び替え
  -M, --month-sort       月名でソートを行う. 月名以外は JAN より小さい
  -n, --numeric-sort       文字列を数値の大小によって比較
  -r, --reverse        比較結果を反転
Other options:

  -c, --check      check whether input is sorted; do not sort
  -k, --key=POS1[,POS2]     start a key at POS1, end it at POS2 (origin 1)
  -m, --merge      merge already sorted files; do not sort
  -o, --output=FILE     write result to FILE instead of standard output
  -s, --stable      stabilize sort by disabling last-resort comparison
  -S, --buffer-size=SIZE    use SIZE for main memory buffer
  -t, --field-separator=SEP  use SEP instead of non-blank to blank transition
  -T, --temporary-directory=DIR  use DIR for temporaries, not $TMPDIR or /tmp;
         multiple options specify multiple directories
  -u, --unique      with -c, check for strict ordering;
         without -c, output only the first of an equal run
  -z, --zero-terminated     文字列の最後に改行でなくヌル文字を付加
      --help  この使い方を表示して終了
      --version  バージョン情報を表示して終了

POS の書式は F[.C][OPTS] であり, F にはフィールド番号, C にはフィールド内の
文字の位置を指定します. OPTS には「並び替えオプション」の中の 1つ以上の文字が
指定され, そのキーに対して全体の「並び替えオプション」よりも優先されます.
キーが指定されなければ, キーとして行全体が使われます.

SIZE の後には次の複数指定可能な接尾辞を指定します.
メモリの % 1%, b は 1, K は 1024 (標準) のように M, G, T, P, E, Z, T.

*** 警告 ***
環境変数によって指定されたロカールで並び替えの順番が変わります.
本来のバイト単位の数値で昔ながらの並び替え順にしたいならば LC_ALL=C を指定.

2011-04-18

linuxのsortコマンドでタブ区切りのファイルをソートする

sort -t "\t" -k 2 hoge.tsv
とかやりたいところですが、これだと
sort: multi-character tab `\\t'
と怒られてしまいます(´・ω・‘)

そこで調べてみたら、CTRL+Vを押してからなら普通にTABが入力できるんですね@@;
sort -t " " -k 2 hoge.tsv
と、こんな感じでやったら出来ましたヾ(*・∀・)ノ"