我想将相同的行打印到两个不同的文件中。我现在正在做的是:
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
打开文件进行写入,它就会保持打开状态,直到进程完成 - 它不会连续截断自己的写入 - 文件描述符在进程的生命周期内保留。