【Linux入門】cutコマンドの基本を学ぶ

ファイル処理の際にデータを細かく切り出したり、必要な部分だけ抽出したりしたいときに便利なのがcutコマンドです。

本稿ではcutコマンドの使い方を丁寧に解説します。


目次

・cutコマンドの用法
・バイト数で斬る(-b)
・文字数で斬る(-c)
・区切り文字で斬る(-d,-f)

・Tips1:パスを切り出す
・Tips2:アウトプットの区切り文字を変える


cutコマンドの用法

cutコマンドの基本的な使い方は以下のようになります。

 

 

(※「$ 」はコマンド受付中のマークです。既に表示されているので皆さんが入力する必要はありません(環境によっては「# 」になっているかもしれません))

cutコマンドは単独で使うというよりは、echoやcat、sedなどの出力結果を受けて、細かい部分をさらに切り出す、というときに用いられることが多いコマンドです。また、cutコマンドも多分に漏れず引数が必ず必要ですが、1つ以上のオプションをちゃんと指定しないとエラーを返すという少し珍しいコマンドと言えるかもしれません。

今回は「nobel.txt」というデータセットを用いて使用法を見ていきましょう!

実際にコマンドを試してみたい方のために日本人ノーベル賞受賞者のうち、最初の10人の受賞年、名前(生年)、受賞分野のリストを作りましたので、必要に応じてご活用下さい。

» 日本人ノーベル賞受賞者最初の10人のリスト



» 閉じる

cutコマンドを使う際はどこをどのように切り出すのかを指示してあげる必要があります。以下、各オプションを見ていきましょう。


バイト数で斬る(-b)

cutコマンドでは切り出すバイト数を指定することができます。例えばnobel.txtの各行の4バイト目を表示するには以下のようにします。

 

 

1文字だけが欲しい場合はともかく、これだけでは何が何だか分かりません。

そこで「1バイト目から4バイト目」を切り出してみましょう。こういうときはハイフンを使用します。

 

 

これで受賞年を切り出すことができました。いまは「1」と最初のバイト数を指定しましたが、先頭のバイト数や文字を起点とする場合は

 

 

のように「1」の部分を省略することができます。また、日本語対応の環境であれば「-n」オプション(2バイト以上の文字を途中で切らないようにするオプション)と併用することもあります。


文字数で斬る(-c)

英数字の場合は-bオプションも-cオプションもほとんど変わらないので、こちらの-cオプションの方を使う機会が多いのではないかと思います。

 

 

ここでは5文字目以降を表示してみました。使い方は-bオプションと変わりません。また、カンマで区切れば複数の部分を切り出すこともできます。以下の例では6文字目~10文字目、18文字目~24文字目を切り出しています。

 

 

空白文字も含めてちゃんと抜き出せていますが、これでは意味のある文字列になっていませんね。

「-c」オプションは決まった形式のファイルや出力結果を整理するときに用いますが、文字数が様々に変動する出力に対応するのは難しいと言えます。このような場合はフレキシブルに対応できる「-d」オプションと「-f」オプションの合わせ技を使います。


区切り文字で斬る(-d,-f)

cutコマンドで最も強力な武器(?)がデリミタ(区切り文字)を指定したフィールド単位の切り出し機能です。このコマンドの書式は以下の通りです。

 

 

「-d」オプションで区切り文字を指定して幾つかのフィールドに分け、「-f」オプションで左からn番目のフィールドを取ってくる、というコマンドです。

例えば

1949/Hideki Yukawa(1907-1981)/Physics

という一連の文字列は「/」という文字によって3つの領域に分けられています。この場合、nobel.txtの各行の真ん中、つまり2番目のフィールドを取ってきたい場合は次のようにします。

 

 

同様に、受賞分野を切り出したいときは

 

 

とします。受賞年と受賞分野を一緒に抜き出すときはカンマで指定すればOKです。

 

 

なお、デリミタ(区切り文字)は1文字しか設定できません。2文字以上を指定するとエラーが返ってきます。

 

勿論、ここまで紹介してきた切り出し操作は正規表現を用いたsedコマンドによっても可能ですが、ユーザーにとってはcutコマンドの方が分かりやすいと言えます。cutコマンドでは「-d」オプションを使用した複数フィールドの切り出しが特に有用です。

デリミタに空白(スペース)を使用することもできますが、タブ文字などがあると空白文字の数が変動しますのでcutコマンドはやや不向きです。こういうときは配列に入れてしまうか、awkコマンドで要素ごとに抜き出した方が良い気がします。

cutコマンドだけ、であったり、sedコマンドだけ、というように一つのコマンドに固執するのではなく、色々なコマンドを柔軟に使えると作業効率も上がると思います。(シェル芸人を目指している方におかれてはその限りではありませんが・・・)

 


Tips1:ディレクトリのパスを取ってくる

nobel.txtというファイルのパスが

「\home\user\ppp\qqq\rrr\nobel.txt」

であるとき、「\home\user\ppp\qqq\rrr」の部分は、文字列をひっくり返すrevコマンドを用いて切り出すことができます。

 

 

(実際にはdirnameコマンドで一発ですが・・・)


Tips2:アウトプットの区切り文字を変える

「–output-delimiter=”xxx”」というオプションで指定することで出力時のデリミタをxxxに変えることができます。

 

 

なお、アウトプットのデリミタの文字数は2文字以上でもOKです。「%」と文字列の間に空白文字を足してみます。

 

 


cutコマンドはオプションの種類がそんなに多くないのでsedコマンドよりは慣れやすいと思います。cutもsedも便利なコマンドですので、適材適所で使ってあげましょう。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です