awk で印刷の出力を複数のファイルにリダイレクトする

awk で印刷の出力を複数のファイルにリダイレクトする

同じ行を 2 つの異なるファイルに印刷したいです。今やっていることは次のとおりです。

print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file1.txt";
print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file2.txt";

2 つの異なるファイルにリダイレクトする単一のコマンドを記述できますか?

編集

コマンド出力全体を複数のファイルに出力するのではなく、いくつかの条件に基づいてレコードの一部を複数のファイルに書き込みたいのですが、これをawkスクリプト内で出力しているので、効率的それを実行する方法。

答え1

ではそれはできませんawk

を使用するとtee、次のようなことができます。

$ awk '{print ID[i]" "Value[i]" "TS1[i]" "TS2[i]}' file | tee out1 out2

tee -a既存のファイルを上書きするのではなく追加する場合に使用します。

出力全体を印刷したくない場合は、以下を試してください。

awk '
    BEGIN {outfile["a.txt"];outfile["b.txt"]}
    { for (file in outfile) { print > file } }' file

答え2

内ではawk、 を使用してファイルにリダイレクトする代わりにprint "text" > "file"、次を使用してコマンドにリダイレクトできます。

print "something" | "tee file1.txt file2.txt"

最初に を使用すると|awkコマンドが生成され、次回は同じコマンドが再利用されるため、そのたびに新しい が開始されることはなく、ファイルが上書きされることもありません (次回新しいコマンドを開始する場合は、teeを呼び出す必要があります)。ただし、と の両方を実行すると、競合が発生します。close("tee file1.txt file2.txt")awk> "file1.txt"| "tee file1.txt..."

>> "file1.txt"代わりに および を使用するとよいでしょう| "tee -a file1.txt..."

しかし、私はまだ@cuonglm のforアプローチまたは、関数を使用するawkと、よりクリーンかつ効率的になります。

答え3

ユーザー定義関数それが懸念事項であれば、コードがよりクリーンになり、重複が減る可能性があります。

function print_to_files( message, file_a, file_b ) {
   print message > file_a;
   print message > file_b;
}

message = sprintf( "%s %s %s %s", ID[i], Value[i], TS1[i], TS2[i] )
print_to_files( message , "filea", "fileb" );'

あるいは、それだけが必要な場合は、ファイルをハードコードします。

function print_to_files( message ) {
   print message > "/path/to/filea";
   print message > "/path/to/fileb";
}

message = sprintf( "%s %s %s %s", ID[i], Value[i], TS1[i], TS2[i] )
print_to_files( message );'

答え4

これは - で実行できますsedが、入力内容が明確でなければ、具体的にどのように説明すればよいかわかりません。それでも、一般的な例を以下に示します。

seq 10 | sed -ne '/1/w ./onesfile.txt' -e '/3/w threesfile.txt'

は、aを含む行のみ1をに書き込みonesfile.txt、それ以外の場合は3、他のすべてを削除します。これは、とてもこれはどのように機能するかの基本的な例ですが、サンプル入力を提供していただければ、もう少し良い例になるかもしれません。

ファイルを書き込み用に開くと、プロセスが完了するまで開いたままになります。つまりsed、ファイル自身の書き込みを継続的に切り捨てることはなく、ファイル記述子はプロセスの存続期間中保持されます。

関連情報