orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

Linuxコマンドでテキストデータを自在に操る

Linuxでテキストデータを扱うときに、コマンドをパイプで繋げるだけでいろいろな処理ができて面白いのですが、綺麗に整理されていない気がするのでまとめてみます。ここでは、cat, paste, join, grep, head, tail, cut, awk, sed, tr, sort, uniq, wc を取り上げます。

ファイルを縦に結合

ファイルを縦に結合します。

コマンド 説明
cat file1 file2 ... file1, file2, ... を縦に結合

cat file | ... としてファイルの中身をパイプに流すのにもよく使います。

ファイルを横に結合

ファイルを横に結合します。あまり使わない?*1


コマンド 説明
paste file1 file2 .. file1, file2, ... を横に結合
join file1 file2 file1file2 でフィールド *2 が共通な行を結合。
フィールドは事前にソートが必要

行の抽出

条件を満たす行を抽出します。

コマンド 説明
grep regex 正規表現に該当する行を抽出
grep -v regex 正規表現に該当しない行を抽出
head -n count 先頭から count 行を抽出
tail -n count 末尾から count 行を抽出

列の抽出

条件を満たす列を抽出します。

コマンド 説明
cut -d delimiter -f fields 行を delimiter で区切り、fields の列を抽出
awk '{print fields}' 行を空白で区切り、fields で指定した列を抽出

cut

delimiter には区切る文字を指定します。デフォルトはタブです。
fields には抽出する列を以下のように指定します。

$ cut -f 1    # 1列目を指定
$ cut -f 1,3  # 1列目と3列目を指定
$ cut -f 1-4  # 1〜4列目を指定
$ cut -f 3-   # 3列目以降を指定

awk

fields$1,$3 のように出力するフィールドを指定します。cutコマンドでは列の順序を入れ替えたり列を複製したりできませんが、awkでは自由に指定できます。*3

例:

$ echo "a b c" | awk '{print $1,$3}'
a c

行を変換


コマンド 説明
sed 's/regex/replacement/' 各行で regex に該当する部分を replacement に置換
tr set1 set2 set1 に含まれる文字を set2 に含まれる対応する文字に変換
tr -d set set に含まれる文字を削除
tr -s set set に含まれる文字の繰り返しを1文字に圧縮

例:

$ echo "I like orange" | sed s/orange/apple/
I like apple
$ echo "I like orange" | sed s/[a-z]/x/
I xike orange
$ echo "I like orange" | sed s/[a-z]/x/g
I xxxx xxxxxx
$ echo "I like orange" | sed 's/like \([a-z]\+\)/eat \1/'
I eat orange
$ echo "I like orange" | tr a-z A-Z
I LIKE ORANGE
$ echo "I like orange" | tr -d aiueo
I lk rng
$ echo "I like apple" | tr -s p
I like aple

その他

コマンド 説明
sort ソートする
sort -r 降順にソートする
uniq 行の重複を取り除く(事前にソートが必要)
uniq -c 行の重複を取り除き出現回数と一緒に表示(事前にソートが必要)
uniq -u 重複のない行だけを表示(事前にソートが必要)
uniq -d 重複した行だけを表示(事前にソートが必要)
wc -l 行数を数える
wc -w 単語数を数える

ここで解説してるのはコマンドの一部の機能だけなので、詳しくは man page を見て下さい。また、cut, sort, uniq についてはcut, sort, uniq で生産性を5%向上させる - bonar noteがわかりやすいと思います。

【2010年9月23日追記】
join の図と、awkの説明を追加しました。

【2014年6月7日追記】
uniqの説明が間違っていたので修正しました。@sig_uzさんありがとうございます。その他、説明がわかりにくかった箇所を加筆修正しました。

*1:説明が適当なので後で書き加えるかも簡単な言葉で説明するのはしんどいので図だけ。詳しくはmanを…

*2:デフォルトでは空白で区切られた1列目。オプションで変更可能なのでman pageを参照。

*3:これはawkの機能のごく一部に過ぎません。詳しくはman pageを参照。