combinare due file di testo con l'aggiunta di un separatore tra?


16

cat file1 file2combinerà due file di testo. Ma se voglio aggiungere un separatore tra, come una o due righe ********************************, devo aprire il primo file e aggiungere la riga alla fine, oppure aprire il secondo file e aggiungere la riga nella parte superiore, quindi eseguire il catcomando? Può essere fatto semplicemente eseguendo un comando?

Risposte:


17

In bashe zshpuoi fare:

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

o come indicato da mikeserv nel suo commento (in qualsiasi shell):

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

e in Bash come ha commentato David Z:

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

Verranno mostrate tutte le nuove righe nei file. Se non si desidera una nuova riga dopo il "separatore" (ad esempio nel caso in cui file2inizi con una nuova riga) è possibile utilizzare echo -n '****', quindi sopprimere la nuova riga dopo il *.


7
puoi fare la stessa cosa in qualsiasi shell comeecho '**********************' |cat file - file2
mikeserv,

Grazie. cat aggiunge sempre una nuova linea tra i file, implicitamente?
StackExchange per tutto il

1
@Tim - sicuramente lo echofa sempre.
Mikeserv,

1
@Tim - non sembra così, ma guarda tu stesso -printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeserv,

1
@Tim è possibile utilizzare ...<(echo -n '****')per sopprimere la nuova riga dall'eco. catmostra solo uno quando il file ne ha uno (alla fine).
Anthon,

6

Un altro approccio senza usare catcome trovato da qui ,

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

La sed 1dpipe finale è rimuovere la prima riga che avrà anche il delimitatore.

Tuttavia, l' seduso finale potrebbe benissimo essere evitato se usiamo il comando come suggerito da 1_CR nei suoi commenti.

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

1
puoi evitare sedcambiando il awkmotivo inFNR == 1 && NR != 1
iruvar

Congratulazioni per aver raggiunto 10K!
G-Man dice "Ripristina Monica" il

@G-Man, grazie mille. È così carino da parte tua congratularsi :)
Ramesh,

Ciò consente una facile estensione al regex dei modelli di file
Paul

3

Puoi anche dividerlo in più comandi:

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

E puoi reindirizzare o reindirizzare quello usando un comando di gruppo o una 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

Ovviamente, puoi scriverlo su più righe invece di usare i punti e virgola, come al solito. Ed è facile estenderlo a un altro file con un altro delimitatore, ecc.


2

Con paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.