Como adicionar novas linhas de outro arquivo com sed

3

Estou tentando encontrar o comando sed para colocar filename em filename1 . Estes são meus dois arquivos separados.

INPUT filename tem:

Cindy   11 22 54
Chester 48 12 84

INPUT filename1 tem:

 Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96


Jefferry 84     98     90

Este é o resultado que eu preciso (saída):

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

Se eu precisar esclarecer alguma coisa, me avise. Basicamente Cindy e Chester tem que estar entre Dora e Jefferry.

    
por TayshaunS 14.10.2014 / 01:28

3 respostas

7

Para adicionar todas as linhas do comando filename to filename1 usando sed , você pode fazer o seguinte:

sed r filename1 filename

Por favor, note que o resultado será um pouco diferente do resultado da sua pergunta, 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

Algumas informações adicionais de sed úteis para esta pergunta:

  • Para adicionar filename após a 4ª linha de filename1 :

    sed '4 r filename' filename1

  • Para adicionar filename após a linha que começa em "Dora" em filename1 :

    sed '/^Dora/ r filename' filename1

  • Para adicionar filename após a 4ª linha e remover as linhas em branco de filename1 :

    sed '/^$/d;4 r filename' filename1

por 14.10.2014 / 02:01
2

There shouldnt be any order if i remember correctly.

Nesse 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
    
por 14.10.2014 / 02:01
2

Se você fizer isso:

sed r file1 file2

... então sed tentará e falhará ao anexar um arquivo r ead com um nome de arquivo de tamanho nulo a cada linha de entrada de ambos os arquivos de entrada nomeados file1 e < em> file2 . Esse comando não é essencialmente diferente de:

sed '' file1 file2

... exceto que w / r é mais lento.

É isso que quero dizer:

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

Veja o open("" ...) com ENOENT após cada linha escrita? Isso é o comando r ead vazio sed é executado. Você não percebe as falhas porque sed está definido para não reclamar sobre um arquivo r ead inexistente chamado em seu script, mas sim para continuar como se nada tivesse acontecido quando tentou r ead 1.

E talvez pareça que funcione porque você só deseja anexar um arquivo ao final de outro - para con cat enate dois arquivos - que sed faz por padrão quando dois arquivos são nomeados - ele lê o primeiro e depois o próximo. Mas se o comando r ead realmente funcionasse, então o arquivo r ead nomeado seria anexado inteiramente à linha every na entrada.

Assim:

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 anexar o conteúdo de um arquivo a outro, você pode fazer:

cat < file2 >> file1

Para acrescentar depois de apenas um certo ponto na entrada, você tem algumas opções. sed está entre eles:

sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1

... que deve funcionar com praticamente qualquer sed .

Ou então, se você tiver um POSIX sed :

{ sed /match/q; cat file2 -; } < file1

... o que deve ser muito mais eficiente.

Ambos os métodos garantem que o conteúdo de file2 seja apenas r uma vez e apenas imediatamente após o primeiro ocorrencia de match em file1 .

Outra maneira poderia parecer:

cat file2 | sed /match/r\ /dev/fd/0 file1

... que leria um arquivo de comprimento nulo depois de cada partida após o primeiro ...

    
por 15.02.2016 / 09:34