Como posso copiar o conteúdo de um arquivo de texto e colá-lo em outro, começando em uma determinada linha?

12

Preciso copiar o conteúdo de um arquivo de texto e colá-lo em outro arquivo de texto. O primeiro arquivo de texto possui 10 linhas de dados e eu preciso que eles sejam copiados para o segundo arquivo de texto, começando na linha número 5 (por exemplo). Portanto, no segundo arquivo de texto, esses dados devem ser escritos da linha 5 à linha 14. Como isso pode ser feito? Desde já, obrigado. Considere-me como um novato em relação ao Linux.

G. Paschalis
fonte

Respostas:

9

heade tailsolução

Suponha que o arquivo de origem seja chamado ~/ae o arquivo a ser inserido seja chamado ~/b. Vamos colocar o arquivo mesclado em ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • O caminho ~/é uma abreviação para o /home/usernome do diretório
  • head copia as cinco primeiras linhas de arquivo ano arquivo recém-criadoc
  • cat lista o conteúdo do arquivo be o anexa ao arquivoc
  • cauda acrescenta o arquivo acomeçando na linha 6 até o final do arquivoc

Após a verificação, renomeie o arquivo mesclado

Depois de verificar que arquivo cé mesclado corretamente a partir de arquivos ae bvamos mudar o nome cpara ausar:

mv ~/c ~/a
  • mvmove o arquivo cpara o arquivo a. Os dados não são movidos fisicamente. O arquivo é simplesmente renomeado, o que economiza tempo.
WinEunuuchs2Unix
fonte
Obrigado pela sua resposta. Funcionou muito bem. No entanto, existe outra maneira de fazer isso sem usar um terceiro arquivo de texto?
G. Paschalis
O terceiro arquivo pode ser renomeado para o arquivo de origem quando terminar. Achei melhor poder visualizar o arquivo primeiro. Vou adicionar as etapas extras à resposta agora.
WinEunuuchs2Unix
Ou ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt
1
@JoJoao Esse é um resumo legal de uma linha :) Para fins de ensino, prefiro usar o método de uma linha por comando e instruções if aninhadas. No entanto, para copiar e colar no terminal, eu amo os forros!
WinEunuuchs2Unix 5/17
16

A ferramenta mais fácil aqui pode ser sed . Para inserir b.txtem a.txtapós a 5ª linha, você poderia escrever:

sed '5r b.txt' a.txt

sedlê o arquivo especificado como argumento ( a.txt) linha por linha. Todas as linhas são reproduzidas na saída da mesma forma que apareceram na entrada, a menos que sejam alteradas por um comando.

o 5 é um endereço (número da linha) no qual o seguinte comando deve ser executado. O comando que usamos é r, que usa um nome de arquivo como argumento (aqui b.txt), lê-o completamente e o insere na saída após a linha atual.

Como está acima, este sed linha de comando imprimirá apenas a saída no terminal, sem gravar em nenhum arquivo. Você pode redirecioná-lo para um novo arquivo (não para nenhum dos arquivos de entrada!) Usando o redirecionamento de saída do Bash:

sed '5r b.txt' a.txt > c.txt

Ou você pode modificar diretamente o arquivo de entrada externo a.txtusando a opção sed's -i(para "no local"). Se você escrever como-i.bak , ele fará uma cópia de backup do arquivo de entrada original com o sufixo .bakprimeiro:

sed -i '5r b.txt' a.txt

Um exemplo:

$ cat a.txt 
January
February
March
April
May
October
November
December

$ cat b.txt 
June
July
August
September

$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December
Byte Commander
fonte
0

(Reutilizando exemplo elegante de @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt

fonte