将打印输出重定向到 awk 中的多个文件

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)

  • 你可以在awk里面做管道。`command = "tee file1.txt file2.txt"; 打印消息 | 命令;` (2认同)

Sté*_*las 11

在 中awkprint "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函数,因为这样会更干净、更高效。

  • @polym:他在 `awk` 脚本中使用了管道,而不是像我的回答那样在 shell 中使用。请参阅:https://www.gnu.org/software/gawk/manual/html_node/Redirection.html (5认同)

Mat*_*att 5

用户定义的函数可能会使您的代码更干净并减少重复(如果这就是问题所在)。

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)