2つのファイルを新しいファイルに連結し、出力を1行で並べ替える方法

2つのファイルを新しいファイルに連結し、出力を1行で並べ替える方法

いくつかの名前が入った 2 つのファイルがあり、 を実行するとcat file1 file2 | sort、ターミナルにはアルファベット順にソートされた名前が表示されますが、 を実行するとcat file1 file2 > file3 | sortソートされた出力が表示されません。なぜでしょうか?

答え1

file1すでにとの出力がfile2新しいファイル にリダイレクトされていますfile3

このコマンドではcat file1 file2 > file3 | sortsortパイプの後に、

これは以下のように確認できます。

cat file1
A
Z
B
cat file2
F
G
C

ここで、コマンド as を実行すると、との内容が書き込まれているcat file1 file2 > file3 | sortことがわかりますが、ソートされていません。file1file2file3

あなたが達成しようとしていることは、次のようにすればかなり簡単に達成できると思います。

cat file1 file2 | sort > file3

ただし、コンソール ウィンドウには出力が表示されません。

ソート後の 2 つのファイルの出力を新しいファイルに書き込むと同時に、ソートされた出力をコンソールで利用できるようにする必要がある場合は、以下のようにします。

cat file1 file2 | sort > file3; cat file3

teeしかし、この場合には活用すると良いでしょう。tee効果的に使用できるのは、

cat file1 file2 | sort | tee file3

上記のコマンドは基本的に 2 つのファイルを連結して並べ替え、その出力をコンソールに表示すると同時に、コマンドを使用して指定された新しいファイルにパイプの出力を書き込みますtee

ユーザーとしてケーシー指摘されているように、zshシステムでシェルが使用できる場合は、以下のコマンドも使用できます。

sort <file1 <file2 | tee file3

答え2

POSIX ではsortユーティリティの目的を次のように定義しています。

指定されたすべてのファイルの行をまとめて並べ替え、結果を指定された出力に書き込みます。

次のように 2 つのファイルを連結された出力ファイルに分類できます。

sort $opts file1 file2 >output_file

シェルの出力を見たい場合はstdout そして結果を出力ファイルに保存し、次を使用しますtee:

sort $opts file[12] | tee output_file

関連情報