今回もテキストから必要な部分を抜き出す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
ここらへんは状況に応じて使い分ければよいでしょう。