Estoy tratando de encontrar el sed
comando para poder filename
ingresarlo filename1
. Estos son mis dos archivos separados.
ENTRADA filename
tiene:
Cindy 11 22 54
Chester 48 12 84
ENTRADA filename1
tiene:
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Jefferry 84 98 90
Este es el resultado que necesito (salida):
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Cindy 11 22 54
Chester 48 12 84
Jefferry 84 98 90
Si necesito aclarar algo háganmelo saber. Básicamente, Cindy y Chester tienen que estar justo entre Dora y Jefferry.
Respuesta1
Para agregar todas las líneas desde filename
hasta filename1
usando sed
el comando, puede hacer lo siguiente:
sed r filename1 filename
Sin embargo, tenga en cuenta que el resultado será ligeramente diferente del resultado de su pregunta, a saber:
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Jefferry 84 98 90
Cindy 11 22 54
Chester 48 12 84
Editar
Alguna sed
información adicional útil para esta pregunta:
Para agregar
filename
después de la cuarta línea defilename1
:sed '4 r filename' filename1
Para agregar
filename
después de la línea que comienza desde "Dora" enfilename1
:sed '/^Dora/ r filename' filename1
Para agregar
filename
después de la cuarta línea y eliminar las líneas en blanco defilename1
:sed '/^$/d;4 r filename' filename1
Respuesta2
No debería haber ningún orden si no recuerdo mal.
En ese caso:
$ cat file2 file1 | column -t
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Jefferry 84 98 90
Cindy 11 22 54
Chester 48 12 84
Respuesta3
Si lo haces:
sed r file1 file2
... luego sed
intentará y no podrá agregar un r
archivo ead con un nombre de archivo de longitud nula a cada línea de entrada de ambos archivos de entrada con nombrefile1
yfile2
. Ese comando no es esencialmente diferente a:
sed '' file1 file2
...excepto que r
es más lento.
Esto es lo que quiero decir:
seq 1 5 > file1
seq 6 10 > file2
strace sed r file[12]
...
write("1\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("2\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("3\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("4\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("5\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
read(3, "", 4096) = 0
close(3) = 0
open("file2", RDONLY) = 3
write("6\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("7\n", 21) = 2
...
Ver el open("" ...)
fracaso conENOENT
siguiendo cada línea escrita? Así se ejecuta el r
comando ead vacío sed
. No notas las fallas porque sed
está especificado no quejarse de un archivo ead inexistente r
nombrado en su script, sino continuar como si nada hubiera pasado cuando intenta r
leer uno.
Y tal vezaspectoParece que funciona porque solo desea agregar un archivo al final de otro, para combinar cat
dos archivos, lo que sed
ocurre de manera predeterminada cuando se nombran dos archivos de entrada: lee el primero y luego el siguiente. Pero si el r
comando ead realmente funcionara entonces el r
archivo ead nombrado se agregaría por completo acadalínea de entrada.
Como esto:
seq 3 > file
printf %s\\n a b c |
sed r\ file
a
1
2
3
b
1
2
3
c
1
2
3
Para agregar el contenido de un archivo a otro, puede hacer:
cat < file2 >> file1
Para agregar solo después de cierto punto en la entrada, tiene algunas opciones. sed
está entre ellos:
sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1
...que debería funcionar con prácticamente cualquier sed
.
O si no tienes un POSIX sed
:
{ sed /match/q; cat file2 -; } < file1
...que debería ser mucho más eficiente.
Ambos métodos garantizan que el contenido defile2
sólo r
se lee una vez y sólo inmediatamente después de la primera aparición match
defile1
.
Otra forma podría verse así:
cat file2 | sed /match/r\ /dev/fd/0 file1
...que leería un archivo de longitud nula después de cada partido después del primero...