Linux cut コマンド:テキストの切り出し

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Linux の cut コマンドを使用して、テキストファイルからデータを抽出・分析する方法を学びます。地元の書店で働いているというシナリオを想定し、顧客情報や書籍情報を処理する必要がある場面をシミュレートします。cut コマンドを使用すると、データファイルから特定の列(カラム)やフィールドを抽出でき、効率的なデータ管理と分析が可能になります。

前提条件

この実験を始める前に、以下を確認してください:

  • Linux コマンドラインに関する基本的な知識
  • Linux ターミナルへのアクセス(この実験では /home/labex/project ディレクトリ内のターミナルを使用することを想定しています)

書店データの確認

まずは、書店のデータファイルを確認することから始めましょう。customers.txtbooks.txt という 2 つのファイルがあります。

最初に、customers.txt ファイルの内容を表示してみましょう:

cat /home/labex/project/customers.txt

以下のような出力が表示されるはずです:

ID,Name,Age,Email
1,John Doe,25,john.doe@email.com
2,Jane Smith,35,jane.smith@email.com
3,Lily Chen,30,lily.chen@email.com
4,Andy Brown,22,andy.brown@email.com

次に、books.txt ファイルを確認します:

cat /home/labex/project/books.txt

出力は以下のようになります:

ISBN,Title,Author,Price
978-1234567890,The Great Adventure,Alice Writer,19.99
978-2345678901,Mystery in the Woods,Bob Author,24.99
978-3456789012,Cooking Basics,Carol Chef,15.99
978-4567890123,Science Explained,David Scientist,29.99

これらのファイルは、顧客や書籍のさまざまなフィールドがカンマで区切られた CSV(Comma-Separated Values)形式になっています。

期待通りの出力が表示されない場合やエラーが発生した場合は、以下を確認してください:

  • 正しいディレクトリ(/home/labex/project)にいること
  • ls -l を実行して、ファイルが存在することを確認する
  • ファイルが見つからない場合は、手動で作成するか、実験管理者に問い合わせてください

顧客名の抽出

データを確認できたので、次は cut コマンドを使って特定の情報を抽出してみましょう。まずは customers.txt ファイルから顧客名だけを取り出します。

cut コマンドでは、-d オプションで区切り文字(デリミタ。今回はカンマ)を指定し、-f オプションで表示したいフィールドを選択します。

次のコマンドを実行してください:

cut -d ',' -f 2 /home/labex/project/customers.txt

このコマンドの内容を解説します:

  • cut: 使用するコマンド名
  • -d ',': フィールド間の区切り文字としてカンマを使用することを指定
  • -f 2: 2 番目のフィールドを抽出するように指示
  • /home/labex/project/customers.txt: 入力ファイルのパス

以下のような出力が表示されるはずです:

Name
John Doe
Jane Smith
Lily Chen
Andy Brown

ヘッダーである "Name" も含まれていることに注目してください。これは、cut がヘッダー行をファイル内の他の行と同じように扱うためです。

ヘッダーを除外したい場合は、tail コマンドを cut と組み合わせて使用します:

cut -d ',' -f 2 /home/labex/project/customers.txt | tail -n +2

このパイプラインは 2 つのことを行います:

  1. cut が各行から 2 番目のフィールド(名前)を抽出します。
  2. tail -n +2 が 2 行目から出力し、実質的にヘッダーをスキップします。

出力は以下のようになります:

John Doe
Jane Smith
Lily Chen
Andy Brown

期待通りの出力が得られない場合:

  • コマンドが正確に入力されているか再確認してください。
  • customers.txt ファイルが変更されていないか確認してください。
  • 再度 cat /home/labex/project/customers.txt を実行して、ファイルの内容を確認してください。

複数のフィールドの抽出

多くの場合、データから複数のフィールドを抽出する必要があります。customers.txt ファイルから顧客名と年齢の両方を抽出してみましょう。

次のコマンドを使用します:

cut -d ',' -f 2,3 /home/labex/project/customers.txt

このコマンドは前のものと似ていますが、-f オプションで 2 つのフィールドを指定しています:

  • -f 2,3: 2 番目と 3 番目のフィールド(名前と年齢)を抽出します。

出力は以下のようになります:

Name,Age
John Doe,25
Jane Smith,35
Lily Chen,30
Andy Brown,22

このように、-f オプションの中でカンマで区切ることで、複数のフィールドを指定できます。出力では、抽出されたフィールド間に元の区切り文字(カンマ)が維持されます。

出力が一致しない場合:

  • -f オプションの 2 と 3 の間にカンマが入っているか確認してください。
  • customers.txt ファイルが改ざんされていないか確認してください。
  • -d ',' オプションなしでコマンドを実行し、ファイルが別の区切り文字を使用していないか確認してください。

フィールド範囲の抽出

cut コマンドでは、フィールドの範囲を指定して抽出することもできます。customers.txt ファイルから、顧客 ID から年齢まで(フィールド 1〜3)を抽出してみましょう。

このコマンドを使用します:

cut -d ',' -f 1-3 /home/labex/project/customers.txt

このコマンドの新しいポイントは以下の通りです:

  • -f 1-3: 1 番目から 3 番目までの範囲のフィールドを指定します。

出力は以下のようになります:

ID,Name,Age
1,John Doe,25
2,Jane Smith,35
3,Lily Chen,30
4,Andy Brown,22

このコマンドは 1 から 3 までのフィールド範囲を抽出します。また、-f 1-3,5 のように、範囲と個別のフィールドを組み合わせて、1、2、3、および 5 番目のフィールドを抽出することも可能です。

期待通りの出力が表示されない場合:

  • -f オプションの 1 と 3 の間にハイフン(-)が使われているか確認してください。
  • customers.txt ファイルが変更されていないか確認してください。
  • 各フィールドを個別に抽出(例:-f 1-f 2-f 3)してみて、すべてのフィールドがファイル内に存在するか確認してください。

固定長フィールドの処理

データが区切り文字で分かれておらず、固定幅の列で配置されていることもあります。cut コマンドは、文字位置を指定する -c オプションを使用することで、このようなデータも処理できます。

まず、固定長データを持つ新しいファイルを作成しましょう:

cat << EOF > /home/labex/project/inventory.txt
ISBN     Title          Quantity
1234567890The Great Adv      100
2345678901Mystery in th       75
3456789012Cooking Basi       50
4567890123Science Exp        125
EOF

このコマンドはヒアドキュメント(<<EOF)を使用して、固定長データを含む inventory.txt という名前の新しいファイルを作成します。

では、文字位置を指定して書籍のタイトルだけを抽出してみましょう:

cut -c 11-25 /home/labex/project/inventory.txt

新しいポイント:

  • -c 11-25: 各行の 11 文字目から 25 文字目までを抽出するように cut に指示します。

以下のように表示されるはずです:

itle          Q
The Great Adv
Mystery in th
Cooking Basi
Science Exp

このコマンドは各行の 11 文字目から 25 文字目を抽出しており、これは固定長データにおけるタイトルフィールドに対応しています。

期待通りの出力が得られない場合:

  • inventory.txt ファイルが正しく作成されたか確認してください(cat /home/labex/project/inventory.txt で確認できます)。
  • 正しい文字範囲(11-25)を使用しているか確認してください。
  • タイトルがずれているように見える場合は、文字範囲を調整してみてください。

cut と他のコマンドの組み合わせ

cut コマンドは、他の Linux コマンドと組み合わせることでさらに強力になります。cutgrep を組み合わせて、価格が 20 ドル以上のすべての書籍を探し、そのタイトルを表示してみましょう。

次のコマンドを実行してください:

grep -E ',[2-9][0-9]\.[0-9]{2}$' /home/labex/project/books.txt | cut -d ',' -f 2

このコマンドパイプラインは 2 つのことを行います:

  1. grep -E ',[2-9][0-9]\.[0-9]{2}$': 正規表現を使用して、価格が 20 ドル以上の行を検索します。
    • ,[2-9][0-9]\.[0-9]{2}$: カンマに続き、20 から 99 までの数字、小数点、そして行末の 2 桁の数字に一致します。
  2. cut -d ',' -f 2: grep が見つけた行から、書籍のタイトル(2 番目のフィールド)だけを抽出します。

以下のような出力が表示されるはずです:

Mystery in the Woods
Science Explained

期待通りの出力が表示されない場合:

  • books.txt ファイルに正しいデータが含まれているか確認してください。
  • grep の正規表現が正しく入力されているか確認してください。
  • grep コマンド単体で実行してみて、どの行が選択されているか確認してください。
  • cut コマンドが正しく 2 番目のフィールドを指定しているか確認してください。

まとめ

この実験では、Linux の cut コマンドを使用してテキストファイルから特定のデータを抽出する方法を学びました。以下の内容を実践しました:

  • CSV ファイルからの単一フィールドの抽出
  • 複数のフィールドおよび範囲指定による抽出
  • 固定長データの処理
  • cutgrep などの他のコマンドとの組み合わせ

これらのスキルは、書店の在庫管理から構造化されたテキストデータの処理まで、さまざまな場面でのデータ処理や分析において非常に価値があります。

この実験でカバーしなかったその他の cut コマンドのパラメータ:

  • -s: 区切り文字を含まない行を出力しない
  • --output-delimiter=STRING: 出力時の区切り文字として STRING を使用する
  • --complement: 選択したバイト、文字、またはフィールドのセットを反転させる(選択しなかったものを表示する)

さらに学習を深めるために、これらの追加パラメータを試したり、独自のデータファイルを作成して練習したりしてみてください。より詳細な情報が必要な場合は、man cut コマンドを実行すると cut コマンドの包括的なマニュアルを確認できます。

関連リソース