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


16

cat file1 file2combinará dois arquivos de texto. Mas se eu quiser adicionar um separador entre, como uma linha ou duas******************************** , preciso abrir o primeiro arquivo e adicionar a linha no final ou abrir o segundo arquivo e adicionar a linha no topo e, em seguida, executar o catcomando? Isso pode ser feito apenas com a execução de um comando?

Respostas:


17

Em bashe zshvocê pode fazer:

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

ou como mikeserv indicado em seu comentário (em qualquer forma):

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

e no Bash como David Z comentou:

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

Quaisquer novas linhas nos arquivos serão mostradas. Se você não quiser uma nova linha após o "separador" (por exemplo, no caso de file2começar com uma nova linha), você pode usar echo -n '****', então suprima a nova linha após o *.


7
você pode fazer a mesma coisa em qualquer shell comoecho '**********************' |cat file - file2
mikeserv 23/10

obrigado. cat sempre adiciona uma nova linha entre arquivos, implicitamente?
StackExchange for All

11
@ Tim - definitivamente echosempre faz.
mikeserv

11
@ Tim - não olha dessa forma aqui, mas ver por si mesmo -printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeserv

11
@ Tim que você pode usar ...<(echo -n '****')para suprimir a nova linha do eco. catmostra apenas um quando o arquivo possui um (no final).
Anthon

6

Outra abordagem sem usar catcomo encontrada aqui ,

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

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

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

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2

11
você pode evitar o sedalterando awkpadrão paraFNR == 1 && NR != 1
Iruvar

Parabéns por atingir 10K!
G-Man diz 'Reinstate Monica'

@ G-Man, muito obrigado. Isso é tão agradável de você para congragulate :)
Ramesh

Isso permite fácil extensão para regex de padrões de arquivos
Paul

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 subshell:

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

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

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


2

Com paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.