●2つのファイルを読み込み、共通するフィールドがある行を結合して表示するコマンドはjoin
コンピュータ上でテキストファイルを扱う際には、改行コードという制御符号について意識する必要があります。OSの改行コードと異なる改行コードのテキストファイルを読み込むと、正しく改行されなかったり、不正な制御コードの付いたファイルだと認識されたりします。
多くのシステムではキャリッジリターン(Carriage Return: CR、\r(16進数で0D))とラインフィード(Line feed: LF、\n(16進数で0A))を使って改行を表します。
改行コードと代表的なOSの組み合わせ。
・CRLF(\r\n):Windows
・LF(\n):Unix OS(Linux, Mac OS Xなど)
・CR(\r):古いMacOS(バージョン9まで)
上記の通りWindowsとLinuxでは改行コードが異なるため、テキストファイルの扱いが問題になる場合があります。CRLF(\r\n)からCR(\r)を取り除くことでLinuxの認識できる改行コード:LF(\n)のみにでき、正しく扱うことができるようになります。
●trコマンドは指定した文字を変換・削除するコマンドです。
tr [オプション] [文字列1 [文字列2]]
オプション
・-d 文字列1で指定した文字を削除
・-s 文字列1で指定した文字が連続した場合、1文字に置き換える
オプションを指定しない場合は、文字列1を文字列2に変換します。
なお、trコマンドは変換対象を標準入力からのみ受け付けます。つまり、変換・削除したい文字列が記載されているファイルをコマンドの引数として指定することが出来ません。そのため、パイプ(|)やリダイレクト(<)を使用してファイルを指定します。
cat ファイル名 | tr [オプション] [文字列1 [文字列2]]
または
tr [オプション] [文字列1 [文字列2]] < ファイル名
●trコマンドで使用できる文字クラスまとめ
・[:alpha:] 英字
・[:lower:] 英小文字(a-z)
・[:upper:] 英大文字(A-Z)
・[:digit:] 数字(0−9)
・[:alnum:] 英数字
・[:space:] スペース
例)「file」ファイルで、連続したスペースをスペース1つに置き換えて表示する場合
$ cat file | tr -s [:space:]
■指定したファイルを行番号をつけて出力するには、nlやcatコマンドを使用。
●nl [オプション] [ファイル名]
オプション
・-b a 空行を含めて全ての行に行番号をつける(catコマンドの-nオプションと同じ)
・-b t 空行を除いた行に行番号をつける(catコマンドの-bオプションを同じ)デフォルト
●cat [オプション] [ファイル名 ...]
オプション
・-n 空行を含めて全ての行に行番号をつける(nlコマンドの-b aオプションと同じ)
・-b 空行を除いた行に行番号をつける(nlコマンドの-b tオプションを同じ)
■ファイルや標準入力の内容を編集して表示するにはsedコマンドを利用します。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]
オプション
-e 編集コマンドを指定(編集コマンドが1つの場合は省略可)
-f 編集コマンドを記述したファイルを指定
編集コマンド
・s/文字列1/文字列2/ 各業の最初に現れる文字列1を文字列2に置換
・s/文字列1/文字列2/g 全ての文字列1を文字列2に置換
・/文字列/d 文字列が含まれる行を削除
・行番号1,行番号2d 行番号1から行番号2までの行を削除
・y/文字1文字2…/文字3文字4…/ 文字1を文字3に、文字2を文字4に置換
■正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
記号と説明
・. 任意の1文字
・* 直前の文字の〇回以上の繰り返し
・[] []内のいずれかの1文字(^ 先頭にある場合は後続の文字以外)
・^ 行頭
・$ 行末
・\ 次の文字をエスケープ(通常の文字として処理)
●拡張表記表現
・+ 直前の文字の1回以上の繰り返し
・? 直前の文字の0回もしくは1回の繰り返し
・| 左右いずれかの文字列
※正規表現の「」と、シェルによって解釈されるメタキャラクタの「」では意味が異なるので注意。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドは以下のとおりです。
・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。
・sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
例2)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
基本正規表現と拡張正規表現の違いに注意。grepコマンドは、-Eオプションを付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。
基本正規表現では「?, +」は「?, +」とすることで、拡張正規表現と同様の意味を持つようになります。