Bashのcutコマンドは、テキストデータを効率的に分割・抽出するための強力なツールです。このガイドでは、cutコマンドの基本的な使い方から、少し進んだテクニックまで、さまざまな活用方法を詳述します。あなたがデータを扱う際に役立つこと間違いなしです。
cutコマンドとは
cutコマンドは、テキストデータのそれぞれの行から特定の列を切り出すためのUnix系コマンドです。ログファイルやCSV形式のデータを操作する際に特に有用です。主に「区切り文字で区切られたフィールドの抽出」や「固定幅の文字列の抽出」に使われます。cutコマンドを理解することで、テキスト処理の効率が大幅に向上します。
cutコマンドの基本シンタックス
cutコマンドは以下のように使用します。
cut [オプション] ファイル
主なオプション
-
-bバイト位置を指定して抽出 -
-c文字位置を指定して抽出 -
-d区切り文字を指定(デフォルトはタブ) -
-fフィールド番号を指定 -
-s区切り文字を含まない行を出力しない -
--complement指定したフィールド・位置以外を出力(除外指定)
基本的な例
例えば、file.txtというファイルの中から特定のフィールドを抜き出す場合、以下のように使用します。
cut -d ',' -f 1 file.txt
ここでは、カンマが区切り文字で、ファイル内の第1フィールドを抽出しています。
具体的な使用例
1. CSVファイルから特定列を抽出
CSVファイルはカンマで区切られたデータが通常です。特定の列を抽出するには、-dオプションでカンマを区切り文字にし、-fオプションで取得するフィールドを指定します。
cut -d ',' -f 2 sample.csv
これにより、sample.csvの第2列が抽出されます。
2. タブ区切りのデータを処理
デフォルトでcutコマンドはタブ文字を区切りにするため、タブ区切りのデータを処理する際は、-dオプションが不要です。
cut -f 3 data.txt
上記のコマンドは、data.txt内の第3フィールドを取得します。
3. 固定位置の文字列を抽出
バイト単位または文字単位でデータを抽出したい場合は、-bや-cオプションを使用できます。
cut -c 1-5 filename.txt
この例では、各行から1文字目から5文字目までを取り出しています。
4. スペース(空白)区切りのデータを処理
スペース区切りのデータをcutで処理する場合は-d ' 'を指定しますが、連続する空白(半角スペースが複数続く場合)は1つの区切りとして扱われない点に注意が必要です。
cut -d ' ' -f 1 access.log
連続するスペースやタブが混在するデータで確実にフィールドを分割したい場合は、cutではなくawk '{print $1}'を使うほうが安定します。awkコマンド自体の使い方はawkコマンド|テキストの抽出・集計・変換を実務パターンで解説で詳しく解説しています。
複数フィールドを抽出
複数のフィールドを同時に抽出することも可能です。
cut -d ',' -f 1,3,5 sample.csv
ここでは、sample.csvから第1、第3、第5フィールドを同時に抽出しています。
特定フィールド「以外」を抽出する(–complement)
逆に「このフィールドだけ除外したい」というケースでは、--complementオプションが便利です。-fで指定したフィールドの補集合(それ以外すべて)を出力します。
cut -d ',' -f 2 --complement sample.csv
この例では、sample.csvから第2フィールドを除いたすべての列が出力されます。除外したい列が少ない場合、抽出したい列をすべて列挙するより短く書けます。
また、区切り文字を含まない行(区切り文字方式が使えない行)を除外したい場合は-sを付けると、ヘッダー行の有無が混在するログなどで意図しない行が出力されるのを防げます。
cut -d ',' -f 2 -s sample.csv
応用技:cutコマンドと他のツールの組み合わせ
cutコマンドは他のコマンドと組み合わせることで、さらに便利になります。例えば、sortやawk、sedと組み合わせることで、データの並び替えやフィルタリング、出力の整形を行えます。
sortとの組み合わせ
一度cutで抽出したデータをsortで並べ替える:
cut -d ',' -f 2 sample.csv | sort
awkとの連携
cutで抽出し、awkでさらに細かく操作:
cut -d ',' -f 2 sample.csv | awk '{ if ($1 > 10) print $0 }'
sedで整形
sedを使って特定のフィールドだけを置換:
cut -d ',' -f 1-3 file.csv | sed 's/old/new/g'
sedコマンドのより詳しい置換テクニックはsedコマンドでbashスクリプトをパワーアップする方法で解説しています。
エラーハンドリング
cutコマンドは強力ですが、適切な使用でデータを失うリスクを避ける必要があります。例えば、不適切な区切り文字や範囲を指定すると、予期しない結果が得られることがあります。常に小規模データでテストしてから大規模データに適用すると良いでしょう。
日本語のような全角文字(マルチバイト文字)を含む行に-cや-bを使うと、文字の途中で切れて文字化けすることがあります。日本語データを扱う場合は、区切り文字を使う-d/-f方式を優先するのが安全です。
よくある質問(FAQ)
cutとawkはどう使い分ければいい?
単純に「区切り文字でフィールドを切り出すだけ」ならcutで十分です。連続する空白の正規化や、条件による絞り込みなど複雑な処理が必要な場合はawkを使いましょう。
cutで複数の区切り文字(カンマとタブなど)を同時に指定できる?
cut単体では区切り文字を1種類しか指定できません。複数の区切り文字を扱いたい場合は、trコマンドで区切り文字を統一してからcutに渡すか、awkの正規表現区切り(-F)を使う方法があります。
cutで最後のフィールドだけ取得するには?
cutには「最後から」という指定方法がないため、フィールド数が可変の場合はrev | cut -d ',' -f 1 | revのように行を反転させてから抽出するか、awkの$NFを使うのが簡単です。
まとめ
cutコマンドは、テキストデータを処理する上で非常に有用なツールです。今回紹介したオプションや使用例を組み合わせることで、さまざまなデータ処理ニーズに対応するスクリプトを作成できます。ぜひ、日々のデータ操作にcutコマンドを活用してみてください。
cutとの使い分けをさらに詳しく知りたい場合はBashで文字列を切り出す方法|部分文字列・末尾取得・cutとの使い分けを解説も、grepとの組み合わせはgrepコマンドの使い方もあわせてご覧ください。

コメント