はじめに
この実験では、Linux の cut コマンドを使用して、テキストファイルからデータを抽出・分析する方法を学びます。地元の書店で働いているというシナリオを想定し、顧客情報や書籍情報を処理する必要がある場面をシミュレートします。cut コマンドを使用すると、データファイルから特定の列(カラム)やフィールドを抽出でき、効率的なデータ管理と分析が可能になります。
前提条件
この実験を始める前に、以下を確認してください:
- Linux コマンドラインに関する基本的な知識
- Linux ターミナルへのアクセス(この実験では
/home/labex/projectディレクトリ内のターミナルを使用することを想定しています)
書店データの確認
まずは、書店のデータファイルを確認することから始めましょう。customers.txt と books.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 つのことを行います:
cutが各行から 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 コマンドと組み合わせることでさらに強力になります。cut と grep を組み合わせて、価格が 20 ドル以上のすべての書籍を探し、そのタイトルを表示してみましょう。
次のコマンドを実行してください:
grep -E ',[2-9][0-9]\.[0-9]{2}$' /home/labex/project/books.txt | cut -d ',' -f 2
このコマンドパイプラインは 2 つのことを行います:
grep -E ',[2-9][0-9]\.[0-9]{2}$': 正規表現を使用して、価格が 20 ドル以上の行を検索します。,[2-9][0-9]\.[0-9]{2}$: カンマに続き、20 から 99 までの数字、小数点、そして行末の 2 桁の数字に一致します。
cut -d ',' -f 2:grepが見つけた行から、書籍のタイトル(2 番目のフィールド)だけを抽出します。
以下のような出力が表示されるはずです:
Mystery in the Woods
Science Explained
期待通りの出力が表示されない場合:
books.txtファイルに正しいデータが含まれているか確認してください。grepの正規表現が正しく入力されているか確認してください。grepコマンド単体で実行してみて、どの行が選択されているか確認してください。cutコマンドが正しく 2 番目のフィールドを指定しているか確認してください。
まとめ
この実験では、Linux の cut コマンドを使用してテキストファイルから特定のデータを抽出する方法を学びました。以下の内容を実践しました:
- CSV ファイルからの単一フィールドの抽出
- 複数のフィールドおよび範囲指定による抽出
- 固定長データの処理
cutとgrepなどの他のコマンドとの組み合わせ
これらのスキルは、書店の在庫管理から構造化されたテキストデータの処理まで、さまざまな場面でのデータ処理や分析において非常に価値があります。
この実験でカバーしなかったその他の cut コマンドのパラメータ:
-s: 区切り文字を含まない行を出力しない--output-delimiter=STRING: 出力時の区切り文字として STRING を使用する--complement: 選択したバイト、文字、またはフィールドのセットを反転させる(選択しなかったものを表示する)
さらに学習を深めるために、これらの追加パラメータを試したり、独自のデータファイルを作成して練習したりしてみてください。より詳細な情報が必要な場合は、man cut コマンドを実行すると cut コマンドの包括的なマニュアルを確認できます。



