Concatenare i file e inserire una nuova riga tra i file


Risposte:


121

Tu puoi fare:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done

Assicurati che il file finalfile.txtnon esista prima di eseguire il comando precedente.

Se ti è permesso usare awkpuoi fare:

awk 'FNR==1{print ""}1' *.txt > finalfile.txt

10
AWK '{print $0}' *.txt
timger

7
Questo ha il netto difetto che ci saranno righe vuote o alla fine (dalla prima alternativa) o all'inizio (seconda alternativa). awk 'FNR==1 && NR > 1 ...'Tuttavia, puoi facilmente proteggerti da questo .
tripleee

5
Se si inserisce >finalfile.txtdopo il doneè possibile sovrascrivere invece di aggiungere, il che rimuoverà il requisito per assicurarsi che il file sia mancante o vuoto prima del ciclo.
tripleee

53

Se hai pochi file sufficienti da poter elencare ciascuno, puoi utilizzare la sostituzione del processo in Bash, inserendo una nuova riga tra ogni coppia di file:

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt

1
Bellissimo! Grazie.
Bob Kocisko

Questo ha funzionato bene per me per i miei certificati Letsencrypt per creare file .pem.
leeman24

35

Se lo facessi io userei sed:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt

In questo pattern sed $ ha due significati, in primo luogo corrisponde solo al numero dell'ultima riga (come un intervallo di linee su cui applicare un pattern) e in secondo luogo corrisponde alla fine della riga nel pattern di sostituzione.

Se la tua versione di sed non ha -s(processare i file di input separatamente) puoi fare tutto come un ciclo però:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

3
O in GNU sed:sed -s '$G' *.txt > finalfile.txt
Ruud Helderman

Solo un flusso! questa dovrebbe essere la risposta accettata!
Yassine ElBadaoui

state attenti ragazzi, ho appena bloccato il mio PC perché l'ho usato findal posto di *.txt, il che significava che il file era stato aggiunto a se stesso!
Xerus

11

Puoi farlo usando xargsse vuoi, ma l'idea principale è sempre la stessa:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

1
Grazie. Trovo xargsmolto più facile da usare rispetto ai loop in bash.
RawwrBag

9

Funziona in Bash:

for f in *.txt; do cat $f; echo; done

A differenza delle risposte con >>(append), l'output di questo comando può essere reindirizzato in altri programmi.

Esempi:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (i genitori sono facoltativi)
  • for ... done | less (piping into less)
  • for ... done | head -n -1 (questo rimuove la riga vuota finale)

7

È così che l'ho fatto su OsX 10.10.3

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done

poiché il semplice comando 'echo' senza parametri è finito in nessuna nuova riga inserita.


Ciò inserisce la stringa alla fine del file; come faccio a inserirlo tra ogni file?
Onassar

3

In Python, questo si concatena con righe vuote tra i file ( ,sopprime l'aggiunta di una riga vuota finale in più):

print '\n'.join(open(f).read() for f in filenames),

Ecco il brutto one-liner di Python che può essere chiamato dalla shell e stampa l'output in un file:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt
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.