初心者目線のLPIC講座 > テキスト処理コマンド > ファイルの編集
テキスト処理コマンドファイルの編集
ここに出てくるコマンドは「tr」「cut」「paste」「join」「nl」「sort」「uniq」です。
まずは「tr」コマンドです。
「tr」コマンド
|
例を示します。「txtfile」というファイルに「lpic」という文字列が記述されているとします。
$ cat txtfile
lpic
linux
これを「l」を「L」に変換して出力すると、
$ cat txtfile | tr ‘l' ‘L'
Lpic
Linux
と表示されます。あるいは入力リダイレクションを使って、
$ tr ‘l' ‘L' < txtfile
と入力しても同じ結果が出ます。
「tr」コマンドでは、変換しても表示するだけなので、実行結果をファイルに保存したい時は、
$ cat txtfile | tr ‘l' ‘L' > txtfile2
のように、出力リダイレクション「>」を使ってファイルに書き込みます。
ちなみに、標準入力なのでヒアドキュメント「<<」を使った例も見てみましょうか。下記の例は「END」が入力されるまで入力された文字列の中で「l」を「L」に変換して出力します。
$ tr ‘l' ‘L' <<END
> lpic
> linux
> END
Lpic
Linux
「lpic」が「Lpic」に、「linux」が「Linux」に変換されていますね。
次に、連続する文字列の変換です。「a-z」ならアルファベットの小文字を、「0-9」なら全ての数字を表します。例えば上記「txtfile」というファイルの中の文字列で、アルファベットの小文字を全て大文字に変換して表示するには以下のようにします。
$ tr [a-z] [A-Z] < txtfile
LPIC
LINUX
「lpic」が「LPIC」に、「linux」が「LINUX」に変換されていますね。
上記の「a-z」のような文字列の指定を「クラス」といい、色々な種類のクラスがあります。
[:alpha:]・・・アルファベット([a-zA-Z]と同じ)
[:lower:]・・・アルファベット小文字([a-z]と同じ)
[:upper:]・・・アルファベット大文字([A-Z]と同じ)
[:digit:]・・・数字([0-9]と同じ)
[:alnum:]・・・全ての英数字(「0-9a-zA-Z」と同じ)
上記のアルファベットの小文字を全て大文字に変換して表示するには、
$ tr [:lowwer:] [:upper:] < txtfile
でもOKです。
続いて「cut」コマンドです。
|
「cut」コマンド
|
例を見ましょう。テキストファイル「txtfile」の中に「ab:cd:ef:gh」という文字列があるとします。ここから「2番目から5番目」の文字列を抜き出したい場合は、
$ cut -c 2-5 txtfile
b:cd
となります。仮にこれが、
$ cut -c 2- txtfile
という風に指定した場合は、
b:cd:ef:gh
という風に、「2番目以降」の文字列が抜き出されます。
区切り文字を「:」と指定した上で「2番目と4番目」の文字列を抜き出したい場合は、
$ cut -d: -f2,4 txtfile
cd: gh
となります。
続いて、ファイルの文字列を水平方向に連結するコマンド、「paste」「join」を紹介します。
まずは「paste」です。
|
「paste」コマンド
|
file1とfile2があるとして、2つのファイルを連結する例を見てみます。
$ cat file1
name
age
$ cat file2
watanabe
24
これを連結させると、
$ paste file1 file2
name watanabe
age 24
と表示されます。
ちなみに、区切り文字を指定すると、
$ paste -d":" file1 file2
name:watanabe
age:24
という風に、間に区切り文字を入れて連結します。
続いて、もう1つの連結コマンド「join」を紹介します。
|
「join」コマンド
|
順を追って例をみましょう。まずfile1とfile2の内容が以下に示します。
$ cat file1
1 first
2 second
3 third
$ cat file2
1 1st
3 3rd
5 5th
これを、第一フィールドつまり1列目が共通である行だけを連結します。「file1」と「file2」を比べると各々「1 first」と「11st」が、「3third」と「33rd」というように、1列目が共通しているので(赤字部分)、これが連結対象の行となります。
1列目が共通であるので列番号を「1」として、コマンドを実行すると、
$ join -j 1 file1 file2
1 first 1st
3 third 3rd
という風に表示されます。
続いては、テキストに行番号を振る「nl」コマンドです。
|
「nl」コマンド
|
これは単純に、指定したファイルを、行番号を付けて出力するコマンドです。「textfile」というファイルの内容が以下だとすると、
$ cat textfile
aaaa
bbbb
cccc
dddd
ここで「nl」コマンドを実行すると、
$ nl textfile
1 aaaa
2 bbbb
3 cccc
4 dddd
となります。
続いて「sort」コマンドは、ファイルを行単位でソート(並べ替え)してから表示します。
|
「sort」コマンド
|
例を示します。「textfile」の中身が以下のようだとすると、
$ cat textfile
bbbb
aaaa
eeee
cccc
dddd
eeee
空白行が1行あり、「eeee」が2行あって重複してますね。これを空白行を無視する「-b」と、逆順にソートする「-r」を付けてしてソートします。
$ sort -br
eeee
dddd
cccc
bbbb
aaaa
別に説明を省くためにまとめてオプションを付けたわけではありませんが、空白行が無視されて、逆順に表示されました。たまにはこんな変化球もいいでしょう(苦笑)。
ちなみに最後は、この「textfile」を、「uniq」コマンドを使ってソートします。
|
「uniq」コマンド
|
「textfile」の中身は、
$ cat textfile
bbbb
aaaa
eeee
cccc
dddd
eeee
これでしたが、「uniq」コマンドを使うと、ソートされるだけでなく、重複する「eeee」がまとまって1つになる・・・とお思いでしょうが、
$ uniq textfile
bbbb
aaaa
eeee
cccc
dddd
eeee
あれ、全く変わっていませんね(苦笑)。
実はこの「uniq」コマンド、最初にソートした状態でないと、その効果を発揮しないのです。
ですから、ここではひとまず「sort」コマンドでソートした結果をパイプ「|」を経由して「uniq」コマンドに処理結果を渡してみましょう。
$ sort textfile | uniq
aaaa
bbbb
cccc
dddd
eeee
さきほどまで「eeee」の行が2つあったのに、1つにまとめられました。
スポンサードリンク