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 awk
script, 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 -a
si 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 |
, awk
genera el comando, y la próxima vez reutiliza el mismo comando, por lo que no inicia uno nuevo tee
cada vez que lo hace y no sobrescribe los archivos (debe llamar close("tee file1.txt file2.txt")
si lo desea). awk
para 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 confor
El enfoque de @cuonglmo utilizar una awk
funció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 1
to the onesfile.txt
y, 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 sed
se 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.