今回もテキストから必要な部分を抜き出すcutコマンドです。前回は文字列から文字を抜き出しましたが、今回はファイルから文字列を抜き出します。

今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください。(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)
また、カレントディレクトリも上記の場所になります。cd ~/Desktop/sampleのようにコマンドを入力してカレントディレクトリを変更しておけばよいでしょう。

ファイルから指定した文字数を抜き出す

 まず、テキストファイル内から指定した文字数だけ抜き出してみましょう。この場合、cutコマンドは最後のパラメーターにファイルパスを指定します。
 以下のように指定するとカレントディレクトリにある1.txtファイルの2文字目が表示されます。

1.txt

ABCDEFGHIJKMNOP
cut -c 2 1.txt

複数行ある場合は各行の2文字目が表示されます。Unicodeに対応している環境であれば日本語はもちろん絵文字も正しく表示されます。そうでない場合は正しい表示になりません。

2.txt

ABCDEFGHIJKMNOP
春はあけぼの
いろはにほへと
😀🐹⚽️🇯🇵
cut -c 2 2.txt

2文字目と4文字目を抜き出すこともできます。ここらへんは前回の指定方法と同じです。

cut -c 2,4 2.txt

範囲を指定して抜き出す場合は以下のようになります。これも前回の指定方法と同じです。

cut -c 1-3 2.txt

ファイルから1列だけ抜き出す

 cutコマンドはファイルから特定の位置の文字を抜き出すだけでなくファイルの列単位で抜き出すこともできます。例えばエクセルから出力されたタブ区切りテキスト(CSVだと問題が発生することがあるのでコマンドで処理する場合はタブ区切りテキストの方が安全)から特定の列だけを抜き出して、まとめて1つのファイルにすることもできます。
 まず、使用するタブ区切りテキストの内容は以下のようになっています。

3.txt

1	18.4	A1地点	北海道
2	18.9	B2地点	青森
3	16.0	C3地点	長野
4	9.2	A4地点	長崎
5	6.1	B5地点	山梨
6	-0.3	C6地点	香川
7	-6.5	D7地点	静岡
8	-1.2	E8地点	宮城
9	0.01	X9地点	鳥取
10	3.8	ZA地点	島根

まず先頭の列を抜き出してみます。列を指定するには以下のようになります。

cut -f 1 3.txt

2番目の列を抜き出す場合は以下のようになります。

cut -f 2 3.txt

タブ区切りテキストではなく,区切り(CSV形式)や任意の文字で区切られている場合は-dを指定し直後に区切り文字を指定します。

4.txt

1,18.4,A1地点,北海道
2,18.9,B2地点,青森
3,16.0,C3地点,長野
4,9.2,A4地点,長崎
5,6.1,B5地点,山梨
6,-0.3,C6地点,香川
7,-6.5,D7地点,静岡
8,-1.2,E8地点,宮城
9,0.01,X9地点,鳥取
10,3.8,ZA地点,島根
cut -f 2 -d , 4.txt

タブ区切り文字の場合は単純に指定するとエラーになるので以下のように指定します。

cut -f 2 -d $'\t' 3.txt

複数の列を抜き出す

 cutコマンドは複数の列を抜き出すこともできます。例えば以下のようにすると1列目と3列目が抜き出されます。

cut -f 1,3 3.txt

 2列目だけ不要で他の列を抜き出す場合は以下のようになります。

cut -f 1,3- 3.txt

 ここで最後の列を抜き出したい場合は困ってしまいます。cutコマンドには最後の列を指定する方法がないためです。一番手軽なのはawkを使って最後の列を抜き出してしまう方法です。以下のようにすると3.txtの最後の列が抜き出されます。

awk '{print $NF}' 3.txt

 最後の列ではなくて最後から2番目の列を抜き出したい場合は以下のように指定します。NF-1の1が最後からの列のカウント(最後から2番目)になります。ここを2にすると最後の列から3番目を示すことになります。

awk '{print $(NF-1)}' 3.txt

 ここらへんは状況に応じて使い分ければよいでしょう。

列の順序を入れ替える

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら