初心者目線のLPIC講座 〜わかりやすいかも、このサイト〜

初心者目線のLPIC講座 > テキスト処理コマンド > ファイルの編集

テキスト処理コマンド

ファイルの編集

ここに出てくるコマンドは「tr」「cut」「paste」「join」「nl」「sort」「uniq」です。

まずは「tr」コマンドです。






「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」コマンド

意味:ファイルの各行から指定した列を抜き出す。

書式:cut [オプション] [ファイル名]

オプション(以下):

-c 文字の位置-[文字の位置]・・・抜き出す位置を文字の位置(例えば「-c 3 5」なら「3番目から5番目まで」という形式)で指定する

-d 区切り文字・・・区切り文字を指定する

-f 列番号・・・取り出す列を指定する

例を見ましょう。テキストファイル「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」コマンド

意味:指定されたファイルの各行を水平方向に連結する。

書式:paste [オプション] [ファイル名]

オプション(以下):

-d 区切り文字・・・区切り文字を指定する。

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」コマンド

意味:共通の列を持つ行を水平方向に連結する。

書式:join [オプション] [ファイル名]

オプション(以下):

-j 列番号・・・連結時に参照する列を指定(つまり、参照した列が共通である行を連結する)

順を追って例をみましょう。まず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」コマンド

意味:テキストファイルに行番号を追加して出力する。

書式:nl [ファイル名]

オプション(以下):

これは単純に、指定したファイルを、行番号を付けて出力するコマンドです。「textfile」というファイルの内容が以下だとすると、

$ cat textfile
aaaa
bbbb
cccc
dddd

ここで「nl」コマンドを実行すると、

$ nl textfile
1  aaaa
2  bbbb
3  cccc
4  dddd

となります。

続いて「sort」コマンドは、ファイルを行単位でソート(並べ替え)してから表示します。

「sort」コマンド

意味:ファイルをソート(並べ替え)する(通常は昇順)。

書式:[オプション] [+開始位置 [-終了位置]] [ファイル名]

オプション(以下):

-b・・・行頭が空白の行は無視する

-f・・・大文字・小文字を区別しない

-r・・・逆順にソートする

例を示します。「textfile」の中身が以下のようだとすると、

$ cat textfile
bbbb
aaaa
eeee

cccc
dddd
eeee

空白行が1行あり、「eeee」が2行あって重複してますね。これを空白行を無視する「-b」と、逆順にソートする「-r」を付けてしてソートします。

$ sort -br
eeee
dddd
cccc
bbbb
aaaa

別に説明を省くためにまとめてオプションを付けたわけではありませんが、空白行が無視されて、逆順に表示されました。たまにはこんな変化球もいいでしょう(苦笑)。

ちなみに最後は、この「textfile」を、「uniq」コマンドを使ってソートします。

「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つにまとめられました。


スポンサードリンク