標準出力リダイレクトが機能しません。

標準出力リダイレクトが機能しません。

Department.txtにはID、部門の列が含まれています。下記から部門、IDの順番を変更するために使用しています。 ここに画像の説明を入力してください。

しかし、以下のコマンドをさらに更新すると ここに画像の説明を入力してください。

その後、Department.txtは出力なしで空になります。私が読んでいるのと同じファイル以外のファイルを使用すると動作します。

私は同じファイルを読んで更新していることを知っていますが、内部的に出力をメモリのどこかに保存し、要求したファイルにダンプする必要があるためいいえ?誰でもこれがどのように機能するかを明らかにできますか?

注:似たような質問がたくさんあることはわかっていますが、それらのどれも実際に|内部的に機能する方法に対する答えを提供しません。これが私が答えなければならない基本的な質問です。

答え1

いいえ、パイプラインはこれを処理しません。パイプは、2 つの命令を順次実行せず、最初の命令の出力をメモリに保存します。両方のプログラムは同時に実行され、パイプと呼ばれる特別なI / Oデバイスを使用して接続されます。ただし、プログラムを開始する前に、シェルはすべてのI / Oリダイレクトを設定します。つまり、出力ファイルを開いて切り捨てます。

GNU awkがあればこれを使うことができますinplace入力ファイルをオーバーライドするオプションです。

gawk -i inplace -F'\.' -v OFS=. '{print $2, $1}' department.txt

関連情報