Linuxでテキストをマージしたりソートしたりする方法はたくさんありますが、複数のファイルの内容を1つのファイルにまとめたいだけなのか、それとも使いやすいように整理したいのか、何をしたいのかによって方法が異なります。この記事では、ファイルの内容を並べ替えたり結合したりするのに使われるコマンドをいくつか紹介し、その結果がどのように異なるかを明らかにします。
catを使う
catコマンドは、ファイル群を1つのファイルにまとめるだけなら簡単な選択です。catとタイプして、コマンドライン上にあるファイルを、マージされたファイルに入れたい順番に並べるだけです。コマンドの出力を、作成したいファイルにリダイレクトします。指定した名前のファイルがすでに存在する場合は、そのファイルは上書きされます。例
$ cat firstfile secondfile thirdfile > newfile
一連のファイルの内容を上書きせずに既存のファイルに追加するには、単に > を >> にします。
$ cat firstfile secondfile thirdfile >> updated_file
マージしたいファイルが何らかの便利な命名規則に従っていれば、この作業はもっと簡単になるでしょう。正規表現を使ってすべてのファイル名を指定できる場合は、すべてのファイルをリストする必要はありません。たとえば、上記のようにすべてのファイルが file で終わっている場合は、次のようになります:
$ cat *file > allfiles
上記のコマンドは、ファイルの内容をアルファベット順に追加することに注意してください。Linuxでは、fileaという名前のファイルはfileAという名前のファイルの前に、file7の後に来ます。結局のところ、英数字列を扱うときには、ABCDEだけでなく、aAbBcCdDeEも考慮する必要があります。ls *fileのようなコマンドを使って、マージされたファイル・ファイルの順序を確認することができます。
注意: まず、コマンドにマージされるファイルに必要なファイルがすべて含まれており、それ以外は含まれていないことを確認してください。マージに使用されたファイルはまだ別個に存在することを忘れないでください。
期間別ドキュメントの統合
ファイル名ではなく、各ファイルの期間に基づいてファイルをマージするには、次のコマンドを使用します:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
trオプションを使用すると、新しい順にソートされたファイルのリストが作成されます。これは例えば、ある活動のログをとっていて、その活動が行われた順に内容を追加したい場合に便利です。
上記のコマンドの$$は、コマンドが実行された時点のプロセスIDを示します。この機能を使う必要はありませんが、新しいファイルを作成するのではなく、既存のファイルにうっかり追加してしまう可能性はほとんどありません。この機能を使用する必要はありませんが、新規ファイルを作成するのではなく、既存のファイルにうっかり追加してしまうことはほとんどありません。$$を使用した場合、結果のファイルは次のようになります:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme Aug 6 12:36 BigFile.
ファイルのマージとソート
Linuxには、マージされたファイルや後続ファイルの内容をソートする興味深い方法がいくつかあります。
コンテンツをアルファベット順にソート
マージされたファイルの内容を並べ替えたい場合は、以下のコマンドで全体の内容を並べ替えることができます:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
ファイルごとに内容をグループ化するには、新しいファイルに追加する前に、以下のコマンドを使用して各ファイルをソートします:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
ドキュメントの数値ソート
ファイルの内容を数値でソートするには、sort の -n オプションを使います。このオプションは、ファイルの行が数字で始まっている場合にのみ有効です。デフォルトの並び順は.NET未満になることを覚えておいてください。n オプションは、行を確実に数値順に並べ替えたい場合に使用します。
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
n オプションは、ファイル内の行が .n や .n などの日付形式で始まっている場合、その内容を日付順に並べ替えることもできます。他の形式の日付でソートするのは難しく、より複雑なコマンドが必要になります。
ペーストの使用
貼り付けコマンドを使うと、ファイルの内容を一行ずつ結合することができます。このコマンドを使用すると、マージされたファイルの最初の行に、マージされる各ファイルの最初の行が含まれます。以下は、行の先頭がわかりやすいように大文字を使った例です:
$ cat file.aA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C theeB four C fourC five
出力を別のファイルにリダイレクトして保存します:
$ paste file.a file.b file.c > merged_content
あるいは、各ファイルの内容を同じ行にマージして、ファイルを貼り合わせることもできます。これには-sオプションが必要です。今回の出力では、各ファイルの内容が表示されていることに注目してください:
$ paste -s file.a file.b file.cA one A two A threeB one B two B three B fourC one C two C thee C four C five
joinを使う
ファイルをマージするためのもう一つのコマンドはjoinです。joinは、共通のフィールドに基づいて複数のファイルの内容をマージすることができます。たとえば、同僚のグループの電話番号などを含むファイルと、同僚の電子メールアドレスを含むファイルがあり、どちらも個人名でリストされているとします。joinを使って、電話番号とメールアドレスの両方を含むファイルを作成することができます。
重要な制限は、各ファイルの行の順序が同じであり、各ファイルの連結に使用されるフィールドが含まれていなければならないということです。
これはコマンドのサンプルです:
$ join phone_numbers email_addressesSandra -1234 bugfarm@gmail.comPedro -0455John -1234 john_doe@gmail.comNemo -4567 cutie@fish.com
この例では、追加情報が欠けていても最初のフィールドが各ファイルに存在しなければなりません。内容を並べ替えると管理しやすくなりますが、順序が一貫している限り、並べ替える必要はありません。
まとめ
Linuxでは、別々のファイルに保存されているデータをマージしたりソートしたりする方法がたくさんあります。これらの方法を使えば、面倒な作業が驚くほど簡単になります。
を経由して





