Aas*_*shu 8 awk text-processing files
我想将相同的行打印到 2 个不同的文件。我现在正在做的是:
print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file1.txt";
print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file2.txt";
Run Code Online (Sandbox Code Playgroud)
我可以编写一个命令将其重定向到两个不同的文件吗?
编辑
我不想将我的整个命令输出打印到多个文件,我想根据某些条件将一些记录写入多个文件,我在awk脚本中打印它,所以我需要一种有效的方法来做到这一点。
cuo*_*glm 11
你不能用awk.
使用tee,您可以执行以下操作:
$ awk '{print ID[i]" "Value[i]" "TS1[i]" "TS2[i]}' file | tee out1 out2
Run Code Online (Sandbox Code Playgroud)
使用tee -a是否要追加,而不是覆盖存在的文件。
如果您不想打印整个输出,可以尝试:
awk '
BEGIN {outfile["a.txt"];outfile["b.txt"]}
{ for (file in outfile) { print > file } }' file
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 11
在 中awk,print "text" > "file"您可以使用以下命令重定向到命令,而不是使用 重定向到文件:
print "something" | "tee file1.txt file2.txt"
Run Code Online (Sandbox Code Playgroud)
第一次使用 that 时|,会awk生成命令,下次它会重用相同的命令,因此tee每次执行该命令时它都不会启动一个新文件,也不会覆盖文件(如果需要,close("tee file1.txt file2.txt")则需要调用awk下次启动新命令)。但是,如果两者都做> "file1.txt",| "tee file1.txt..."就会发生冲突。
然后,您可能想要使用>> "file1.txt"and| "tee -a file1.txt..."代替。
但是,我仍然会采用@cuonglm 的for方法或使用一个awk函数,因为这样会更干净、更高效。
用户定义的函数可能会使您的代码更干净并减少重复(如果这就是问题所在)。
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" );'
Run Code Online (Sandbox Code Playgroud)
或者如果您需要的话,可以对文件进行硬编码。
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 );'
Run Code Online (Sandbox Code Playgroud)