フィルタによるテキスト処理 <- Linux覚書 <- TetraCalibers
TetraCalibers :
    -   for : science student & programmer
Linux覚書 - 5
フィルタによるテキスト処理
    フィルタとは、標準入力を入力として受け取り、(加工した上で)標準出力に出力するコマンドの総称である。

     

    パイプラインと組み合わせて使われることが多いため、引数を省略して記載することにする。

     

    カウント

     

    • wcで行数・単語数・バイト数を表示
    • wc -lで行数を表示
    • wc -wで単語数を表示
    • wc -cでバイト数を表示

     

    ソート

     

    • sortで行をASCIIコード順に並び替え
    • sort -nで数値順に並び替え
    • sort -rで逆順に並び替え
    • sort -k 列番号sでs列目の値によって並び替え
    • sort -uで重複行を1行とみなして表示

     

    重複行の除去

     

    • uniqで連続した重複行を除去
    • uniq -cで重複行数をカウント

     

    一部切り出し

     

    • cut -d 区切り文字 -f 列番号(複数可※カンマ区切り)で各行の一部(特定の列のみ)を切り出して表示

     

    文字の置換・削除

     

    • tr 置換前の文字 置換後の文字で文字を置換して表示
    • tr -d 文字で文字を削除して表示

     

    例えば、アルファベットを全て大文字にしたいときは、次のように指定する。
    cat ファイル | tr a-z A-Z
    
    trコマンドは他のフィルタコマンドとは異なり、コマンド単体ではファイルを読み取る能力を持たないため、上記のようなパイプラインか、入力リダイレクトを使う必要がある。

     

    aをAに、bをBに、cをCに置換したいときは、次のように指定する。
    cat ファイル | tr abc ABC
    
    trコマンドの引数では、連続した文字は文字列ではなく文字範囲としてみなされる。

     

    末尾部分の表示と追記の監視

     

    • tailでファイルの末尾10行を表示
    • tail -n 数値sで末尾s行を表示
    • tail -fで追記監視モードをスタート

     

    差分

     

    diff ファイルA ファイルB
    12c15
    < def
    ---
    > qvw
    
    上記の例は、『ファイルAの12行目(def)が、ファイルBの15行目の内容(qvw)に変更(change)された』ということを表している。

     

    • <$\cdots$1つ目のファイルにだけある行
    • >$\cdots$2つ目のファイルにだけある行

     12c15の部分のcは変更種別を表し、adの場合もある。 例えば、

    • 12a15なら、ファイルAの12行目の後に、ファイルBの15行目の内容が追加された
    • 12c15なら、ファイルAの12行目が、ファイルBの15行目の内容に変更された
    • 12d15なら、ファイルAの12行目の箇所がファイルBでは削除されている
    ことを表す。

     

    まったく同じ差分をユニファイド出力形式(-uオプション付き)で得ると、次のようになる。
    diff -u ファイルA ファイルB
    @@ -12,1 +15,1 @@
    abc
    -def
    +qvw
    xyz
    

     @@ -12,1 +15,1 @@の部分は、『ファイルAの12行目から1行、ファイルBの15行目から1行』が変更されたことを表す。

     

    ユニファイド出力形式では、変更部分の前後数行も表示される。
    • -は削除された行
    • +は追加された行
    を表す。