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.