我想將相同的行列印到兩個不同的文件中。我現在正在做的是:
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
打開文件進行寫入,它就會保持打開狀態,直到進程完成 - 它不會連續截斷自己的寫入 - 文件描述符在進程的生命週期內保留。