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 | file1 と file2 でフィールド *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列目以降を指定
行を変換
コマンド | 説明 |
---|---|
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さんありがとうございます。その他、説明がわかりにくかった箇所を加筆修正しました。