6.11. テキストファイルのソート【sort】

$ sort[オプション]ファイル名

テキストファイルの行を並び替えるには、sort コマンドを使用します。オプションを指定せずに実行すると行頭からの文字を比較し ASCII コードの順にソートされます。ソート後の結果は標準出力へ表示されますので、ファイルとして保存するには -o オプションを指定するかリダイレクトを使用します。

例えば、sample.txt の内容を cat コマンドで表示します。

$ cat sample.txt 
Taro Yamada
Jiro Tanaka
Hanako Suzuki
Kenta Nakamura
Saburo Kobayashi

これを、sort コマンドでソートすると以下のようにアルファベット順にソートされます。

$ sort hoge.txt
Hanako Suzuki
Jiro Tanaka
Kenta Nakamura
Saburo Kobayashi
Taro Yamada

以下に sort コマンドの代表的なオプションを示します。

表 6-8. sort コマンドのオプション

-b行の先頭の空白は無視してソートします。
-cすでにソート済みのファイルかどうかをチェックします。
-dアルファベット、空白、数字だけを使用してソートします。
-f小文字を大文字としてソートします。
-k フィールド番号1[,フィールド番号2]...+ と同様にソート対象とするフィールドを指定します。カンマで区切ってフィールド番号を指定した場合は、フィールド番号1〜フィールド番号2の範囲指定になります。フィールド番号2を省略した場合は、行末までが対象です。1番目のフィールドは1になります。
-m ファイル名...複数のファイルをソートしながら1つのファイルにまとめます。ただし、各ファイルは事前にソートされている必要があります。
-n先頭の数字や +、- などの記号を文字列ではなく数値としてソートします。
-o ファイル名ソート結果を指定したファイルへ保存します。
-r逆順にソートします。
-t [セパレータ]セパレーターで行の区切りを指定します。省略された場合は、空白がセパレータとなります。-k オプションなどでソートの対象とする列の番号を指定する際の区切りとなります。
-u同じ行が存在する場合、1行にまとめます。
+フィールド番号1 [-フィールド番号2]ソート対象とするフィールド番号を指定します。フィールド番号1〜フィールド番号2の範囲指定になります。フィールド番号2を省略した場合は、行末までが対象です。1番目のフィールドは、 +0 と指定します。よって、2番目のフィールド、3番目のフィールは、+1、+2 と指定します。

オプションを使用したソートの例を以下に示します。ここでは、/etc/passwd ファイルで動作を確認してみます。

先に述べた通り、オプションを指定しなければ先頭の文字からアルファベット順にソートされます。

$ sort /etc/passwd
adm:x:3:4:adm:/var/adm:
amanda:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
ftp:x:14:50:FTP User:/var/ftp:
        :
        :
      (省略)
        :
        :
taro:x:500:500::/home/taro:/bin/bash
tomcat4:x:91:91:Tomcat4:/var/tomcat4:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:
www:x:301:302::/var/www:/bin/bash
zope:x:305:306:Zope Server:/var/lib/zope:/bin/bash

結果が標準出力されます(/etc/passwd が書き換えられたわけではありません)。

次に、ユーザーID を対象にソートしてみます。そのためには、フィールドを区切る文字が : であることを指定する必要があります(指定しない場合はスペースとタブによって区切られていると仮定されます)。 これは -t オプションで指定します。 -t の後に区切りとする文字を指定します。

また、ユーザーID は 3 番目のフィールドなので、3 番目のフィールドを対象にソートするように指定する必要があります。sort コマンドでは、最初のフィールド、2 番目のフィールド、3 番目... を、+0、+1、+2 と指定します。 最初のフィールドが +0 になることに注意してください(-k オプションを指定した場合は +1 となります)。 この例では 3 番目のフィールドを対象とするので、+2 を指定します。

また、ユーザーID が文字列ではなく、数字として認識されるように、-n オプションの指定も必要です。

よって、ユーザーID を対象にソートするには、次のコマンドを実行します。

$ sort -n -t : +2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
        :
        :
      (省略)
        :
        :
mysql:x:303:304:MySQL server:/var/lib/mysql:/bin/bash
squid:x:304:305::/var/spool/squid:/dev/null
zope:x:305:306:Zope Server:/var/lib/zope:/bin/bash
taro:x:500:500::/home/taro:/bin/bash
jiro:x:501:501::/home/jiro:/bin/bash