2012-01-21
テキストファイルを処理するときのUnixコマンドまとめ
個人的にテキストファイルを処理することが多いのですが,簡単な処理ならUnixのコマンドをパイプとリダイレクトで組み合わせてできることが多くあります.今回はそんななかでもちょっとマニアックなTIPSをまとめてみました.
sortコマンドでタブ区切りのファイルを指定する
最近知って驚愕したのがこれ.
sortコマンドでタブ区切りのファイルを指定したいときは,Ctrl+v Tabでタブ文字を入力していたのですが,
$ sort -t $'\t' -k 2,2 < input.txt
のようにしてタブ区切りで2番目のキーでソートすることができます.
1000行おきにデータをサンプリングする
1000行おきにファイルからデータをサンプリングしたいときとかは,perlでワンライナーを書くのが速いようです.
$ perl -ne '$i++; print unless ($i % 1000)' < input.txt
某所のコードゴルフによるとこれだけ短くできるみたいです(気持ち悪い‥)
$ perl -ne '$.%1e3||print' < input.txt
$ perl -pe '$_=""if$.%1e3' < input.txt
pythonだとこうはいきませんね.こういうのを見ると,perlも使いこなせるようになりたいところ.
タブ区切りのフィールドを指定して取り出す
タブ区切りのフィールドを指定して取り出すには,cutコマンドが便利です.
$ cut -f 3 < input.txt
$ cut -f 3,4 < input.xt
ただし,フィールドを入れ替えることはできないので,その場合はawkを使うことになります.
$ awk '{print $3, $2;}'
awkだとデフォルトがスペース区切りなので,入力をタブ区切りにするにはsortと同じように$'\t'を区切り文字に指定し,出力をタブ区切りにするにはOFS="\t"を指定する必要があります.ちょっと面倒ですが…
$ awk -F $'\t' '{OFS="\t"; print $3, $2;}'
cutコマンドの逆で行数が同じ複数のファイルを列結合(SQLでいうJOIN)するには,pasteコマンドが使えます.
追記:@overlastさんがこんな記事を書いていました.
[O] テキストファイルをソートするときに頻繁に使うUnixコマンド
sortするとき,環境変数に LC_ALL=C を設定しておくことは大事ですね! いつもはaliasにしているので書き忘れてしまいました.
- 578 http://b.hatena.ne.jp/
- 496 http://b.hatena.ne.jp/hotentry
- 394 http://b.hatena.ne.jp/hotentry/it
- 208 http://reader.livedoor.com/reader/
- 206 http://t.co/J8EIf5Fd
- 163 http://www.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&url=http://choichoi.sakura.ne.jp/hatena_bookmark.xml&container=ig&view=default&lang=en&country=US&sanitize=0&v=975b02c2fabfe19e&parent=http://www.google.com&libs=core:core.io:core.
- 136 http://bit.ly/A6yKWQ
- 98 http://www.google.co.jp/reader/view/
- 89 http://www.sleipnirstart.com/
- 84 http://t.co/WEZc99bk