将打印输出重定向到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打开文件进行写入,它就会保持打开状态,直到进程完成 - 它不会连续截断自己的写入 - 文件描述符在进程的生命周期内保留。

相关内容