combina dois arquivos de texto com a adição de um separador entre?

15

cat file1 file2 combinará dois arquivos de texto. Mas se eu quiser adicionar algum separador entre, como uma linha ou duas de ******************************** , eu tenho que abrir o primeiro arquivo e adicionar a linha no final, ou abrir o segundo arquivo e adicionar a linha no topo, e, em seguida, execute o comando cat ? Pode ser feito apenas com um comando?

    
por Tim 23.10.2014 / 14:40

4 respostas

17

Em bash e zsh você pode fazer:

cat file1 <(echo '********************************') file2

ou como mikeserv indicou em seu comentário (em qualquer shell):

echo '********************************' | cat file1 - file2

e no Bash como David Z comentou:

cat file1 - file2 <<< '********************************'

Qualquer nova linha nos arquivos será mostrada. Se você não quiser uma nova linha após o "separador" (por exemplo, no caso de file2 começar com uma nova linha), você pode usar echo -n '****' , portanto, suprima a nova linha após o * .

    
por 23.10.2014 / 14:44
4

Outra abordagem sem usar cat como encontrado em aqui ,

awk 'FNR==1{print "******"}{print}' file1 file2 | sed '1d'

O final sed 1d pipe é remover a primeira linha que também terá o delimitador.

No entanto, o uso final de sed poderia muito bem ser evitado se usarmos o comando como sugerido por 1_CR em seus comentários.

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2
    
por 23.10.2014 / 18:25
3

Você também pode dividi-lo em vários comandos:

cat file1; echo '------------'; cat file2

E você pode canalizar ou redirecionar isso usando um comando de grupo ou um subnível:

# GROUP COMMAND:
{ cat file1; echo '----------'; cat file2; } | other-command
#                                        ^ final semicolon is part of the syntax!

# SUBSHELL:
( cat file1; echo '----------'; cat file2 ) | other-command

Claro, você pode escrever isso em várias linhas em vez de usar ponto e vírgula, como normal. E é fácil estender para outro arquivo com outro delimitador, etc.

    
por 23.10.2014 / 18:43
2

com paste :

$ echo '********************************' | paste -sd$'\n' file1 - file2
    
por 23.10.2014 / 18:47