Redirigir la salida de impresión a varios archivos en awk

Redirigir la salida de impresión a varios archivos en awk

Quiero imprimir las mismas líneas en 2 archivos diferentes. Lo que estoy haciendo ahora es:

print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file1.txt";
print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file2.txt";

¿Puedo escribir un solo comando para redirigirlo a dos archivos diferentes?

EDITAR

No quiero imprimir toda la salida de mi comando en varios archivos, quiero escribir algunos registros según alguna condición en varios archivos. Estoy imprimiendo esto dentro del awkscript, por lo que necesito uneficientemanera de hacerlo.

Respuesta1

No puedes hacerlo con awk.

Usando tee, puedes hacer algo como esto:

$ awk '{print ID[i]" "Value[i]" "TS1[i]" "TS2[i]}' file | tee out1 out2

Úselo tee -asi desea agregar archivos existentes en lugar de anularlos.

Si no desea imprimir el resultado completo, puede intentar:

awk '
    BEGIN {outfile["a.txt"];outfile["b.txt"]}
    { for (file in outfile) { print > file } }' file

Respuesta2

Dentro de awk, en lugar de redirigir a un archivo con print "text" > "file", puedes redirigir a un comando usando:

print "something" | "tee file1.txt file2.txt"

La primera vez que lo usa |, awkgenera el comando, y la próxima vez reutiliza el mismo comando, por lo que no inicia uno nuevo teecada vez que lo hace y no sobrescribe los archivos (debe llamar close("tee file1.txt file2.txt")si lo desea). awkpara iniciar un nuevo comando la próxima vez). Sin embargo, si haces ambas cosas > "file1.txt", | "tee file1.txt..."habrá un conflicto.

Es posible que desee utilizar >> "file1.txt"y | "tee -a file1.txt..."en su lugar.

Sin embargo, todavía iría conforEl enfoque de @cuonglmo utilizar una awkfunción que sería más limpia y más eficiente.

Respuesta3

Afunción definida por el usuariopodría hacer que su código sea más limpio y causar menos duplicación, si esa es la preocupación.

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" );'

O codifique los archivos si eso es todo lo que necesita.

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 );'

Respuesta4

Puede hacer esto con sed, pero sin una idea más clara de su aporte, no sé cómo demostrarlo específicamente. Aún así, aquí hay un ejemplo genérico:

seq 10 | sed -ne '/1/w ./onesfile.txt' -e '/3/w threesfile.txt'

Eso escribe solo las líneas que contienen a 1to the onesfile.txty, de lo contrario, for 3; todo lo demás se elimina. Esto es unmuyejemplo básico de cómo podría funcionar esto, pero si pudiera proporcionar información de muestra, podría hacerlo un poco mejor.

Una vez que sedse abre un archivo para escribir, permanece abierto hasta que se completa el proceso; no trunca continuamente sus propias escrituras; los descriptores de archivos se conservan durante la vida del proceso.

información relacionada