Linux でテキストファイルをマージしたりソートする方法はいくつかありますが、それをどう行うかは、単に複数のファイルの内容をひとつの大きなファイルに入れたいのか、それとも使いやすいように何らかの方法で整理したいのか、何を達成しようとしているかによって異なります。 この投稿では、ファイルの内容を並べ替えたり結合したりするいくつかのコマンドを見て、結果がどのように異なるかに注目します。
catの使用
ファイルのグループを 1 つのファイルにまとめたいだけなら、cat コマンドは簡単な選択です。 cat」と入力し、マージされたファイルに含めたい順番にコマンドライン上のファイルをリストアップするだけです。 コマンドの出力を、作成したいファイルにリダイレクトする。 指定された名前のファイルがすでに存在する場合は、作成するファイルで上書きされます。 たとえば、
$ cat firstfile secondfile thirdfile > newfile
一連のファイルの内容を上書きするのではなく、既存のファイルに追加したい場合は、> を >> に変更するだけです。
$ cat firstfile secondfile thirdfile >> updated_file
マージするファイルが何らかの便利な命名規則に従っていれば、作業はさらにシンプルにできます。 正規表現を使用してファイル名を指定することができれば、すべてのファイル名を含める必要はありません。 たとえば、上記の例のようにすべてのファイルが “file” という単語で終わっている場合、次のようにすることができます:
$ cat *file > allfiles
上記のコマンドはファイルの内容を英数字順に追加することに注意してください。 Linuxでは、「filea」という名前のファイルは「fileA」という名前のファイルの前に追加され、「file7」という名前のファイルの後に追加されます。 結局のところ、英数字を扱うときには「ABCDE」と考えるだけでなく、「0123456789aAbBcCdDeE」と考えなければならないのです。 ファイルをマージする前に、いつでも “ls *file” のようなコマンドを使って、ファイルが追加される順序を見ることができます。
NOTE: 最初に、コマンドにマージされるファイルに必要なファイルがすべて含まれ、それ以外が含まれないことを確認するのは良い考えです – 特に “*” などのワイルドカードを使っているときです。 そして、マージされたファイルはまだ別のファイルとして存在することを忘れないでください。
年齢によるファイルのマージ
ファイル名ではなく、各ファイルの年齢に基づいてファイルをマージしたい場合、次のようなコマンドを使用してください:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
-tr オプション (t=time, r=reverse) は古い順にファイルをリストアップすることに使用されます。 これは、たとえば、ある活動のログを保存していて、その活動が行われた順に内容を追加したい場合に便利です。
上のコマンドの $$ は、コマンドを実行したときのプロセス ID を表します。 これを使用する必要はまったくありませんが、新しいファイルを作成する代わりに、既存のファイルの末尾に誤って追加してしまうことをほぼ不可能にします。 5549>
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
ファイルのマージとソート
Linux では、マージの前または後にファイルのコンテンツをソートする興味深い方法がいくつか用意されています。
アルファベット順に内容をソートする
マージされたファイルの内容をソートしたい場合、次のようなコマンドで全体の内容をソートできます:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
内容をファイルごとにグループ化しておきたい場合、新しいファイルに追加する前に次のようなコマンドで各ファイルをソートします:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
数字順にソートする
ファイル内容を数字的に並べるには、-n オプションと sort を使用します。 このオプションは、ファイルの行が数字で始まっている場合のみ有効です。 デフォルトの並び順では、”02″ は “1” よりも小さいとみなされることを覚えておいてほしい。 5549>
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
-n オプションは、ファイルの行が “2020-11-03” や “2020/11/03” といったフォーマット(年・月・日形式)で始まっている場合、ファイルの内容を日付順にソートすることもできます。
Using the paste
The paste command allows you to join the content of files on a line by line basis. このコマンドを使用すると、マージされたファイルの最初の行には、マージされた各ファイルの最初の行が含まれます。 以下は、行の出所がわかりやすいように大文字を使った例です:
$ cat file.aA oneA twoA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C thee B four C four C five
出力を別のファイルに移して保存する:
$ paste file.a file.b file.c > merged_content
また、各ファイルの内容が1行に結合されるようにファイルを貼り合わせることもできます。 これには、-s(sequential)オプションを使用する必要があります。
$ 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
Using join
ファイルを結合するもう一つのコマンドは join です。 joinコマンドは、共通のフィールドに基づいて複数のファイルの内容を結合することができます。 たとえば、同僚のグループの電話番号を含むファイルと、個人の電子メールアドレスを含むファイルがあり、両方とも個人名でリストされているとします。 join を使用して、電話番号と電子メールアドレスの両方を含むファイルを作成できます。
重要な制限事項として、ファイルの行は同じ順序でリストされている必要があり、各ファイルに join フィールドが含まれていなければなりません。 内容をソートすることは有用であり、おそらく管理はずっと簡単ですが、順序が一貫している限りは必要ありません。
まとめ
別々のファイルに保存されているデータをマージしソートするために、Linux では多くのオプションがあります。 このオプションにより、いくつかの退屈なタスクが驚くほど簡単になります。