nokunoの日記 このページをアンテナに追加 RSSフィード Twitter

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コマンドが使えます.


追記:@さんがこんな記事を書いていました.

[O] テキストファイルをソートするときに頻繁に使うUnixコマンド

sortするとき,環境変数に LC_ALL=C を設定しておくことは大事ですね! いつもはaliasにしているので書き忘れてしまいました.

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。