Cómo agregar nuevas líneas desde otro archivo con sed

Cómo agregar nuevas líneas desde otro archivo con sed

Estoy tratando de encontrar el sedcomando para poder filenameingresarlo filename1. Estos son mis dos archivos separados.

ENTRADA filenametiene:

Cindy   11 22 54
Chester 48 12 84

ENTRADA filename1tiene:

 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 filenamehasta filename1usando sedel 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 sedinformación adicional útil para esta pregunta:

  • Para agregar filenamedespués de la cuarta línea de filename1:

    sed '4 r filename' filename1

  • Para agregar filenamedespués de la línea que comienza desde "Dora" en filename1:

    sed '/^Dora/ r filename' filename1

  • Para agregar filenamedespués de la cuarta línea y eliminar las líneas en blanco de filename1:

    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 sedintentará y no podrá agregar un rarchivo ead con un nombre de archivo de longitud nula a cada línea de entrada de ambos archivos de entrada con nombrefile1yfile2. Ese comando no es esencialmente diferente a:

sed '' file1 file2

...excepto que res 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 conENOENTsiguiendo cada línea escrita? Así se ejecuta el rcomando ead vacío sed. No notas las fallas porque sedestá especificado no quejarse de un archivo ead inexistente rnombrado en su script, sino continuar como si nada hubiera pasado cuando intenta rleer uno.

Y tal vezaspectoParece que funciona porque solo desea agregar un archivo al final de otro, para combinar catdos archivos, lo que sedocurre de manera predeterminada cuando se nombran dos archivos de entrada: lee el primero y luego el siguiente. Pero si el rcomando ead realmente funcionara entonces el rarchivo 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. sedestá 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 defile2sólo rse lee una vez y sólo inmediatamente después de la primera aparición matchdefile1.

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...

información relacionada