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

10

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

    
por G. Paschalis 27.08.2017 / 23:19

3 respostas

7

head e tail solution

Suponha que o arquivo de origem seja chamado de ~/a e o arquivo a ser inserido seja chamado de ~/b . Colocaremos o arquivo mesclado em ~/c :

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • O caminho ~/ é curto para o nome do diretório /home/user
  • copia as cinco primeiras linhas do arquivo a no arquivo recém-criado c
  • cat lista o conteúdo do arquivo b e o anexa ao arquivo c
  • final acrescenta o arquivo a a partir da linha 6 até o final do arquivo c

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

Depois de verificar se o arquivo c está mesclado corretamente dos arquivos a e b , renomearemos c para a usando:

mv ~/c ~/a
  • mv move o arquivo c para o arquivo a . Os dados não são movidos fisicamente. O arquivo é simplesmente renomeado, o que economiza tempo.
por WinEunuuchs2Unix 27.08.2017 / 23:30
16

A ferramenta mais fácil aqui pode ser sed . Para inserir b.txt em a.txt após a quinta linha, você pode escrever:

sed '5r b.txt' a.txt

sed lê o arquivo especificado como argumento ( a.txt ) linha por linha. Todas as linhas são reproduzidas na saída exatamente como aparecem na entrada, a menos que sejam alteradas por um comando.

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

Como está acima, essa linha de comando sed só imprimirá a saída no terminal, sem gravar em nenhum arquivo. Você pode redirecioná-lo para um novo arquivo (não um 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.txt usando a opção sed -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 .bak first:

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
    
por Byte Commander 28.08.2017 / 00:59
0

(Reutilizando um exemplo elegante do @ByteCommander:)

awk '1; NR==5 {system("cat b.txt")}' a.txt
    
por JJoao 05.09.2017 / 18:24