將列印輸出重定向到awk中的多個文件

將列印輸出重定向到awk中的多個文件

我想將相同的行列印到兩個不同的文件中。我現在正在做的是:

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

我可以編寫一個命令將其重定向到兩個不同的檔案嗎?

編輯

我不想將整個命令輸出列印到多個文件,我想根據某些條件將一些記錄寫入多個文件,我在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"and| "tee -a file1.txt..."來代替。

但是,我仍然會選擇@cuonglm 的for方法或使用awk函數,因為這樣會更乾淨、更有效率。

答案3

A使用者定義函數可能會使您的程式碼更乾淨並減少重複(如果這就是問題所在)。

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到 the 中onesfile.txt,否則將 for 3- 其他所有內容都將被刪除。這是一個非常這是如何工作的基本範例,但如果您可以提供範例輸入,我可能會做得更好一點。

一旦sed打開文件進行寫入,它就會保持打開狀態,直到進程完成 - 它不會連續截斷自己的寫入 - 文件描述符在進程的生命週期內保留。

相關內容