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)が含まれています。

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

  • 正しいディレクトリ(/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番目のフィールドを抽出するように cut に指示
  • /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 コマンドの包括的なマニュアルが表示されます。