2010-04-05 15 views
23

Sto usando cat * .txt per unire più file txt in uno solo, ma ho bisogno che ogni file sia su una riga separata.Linux: Unione di più file, ciascuno su una nuova riga

Qual è il modo migliore per unire i file con ogni file visualizzato su una nuova riga?

+0

'cat' fa che di default. –

+7

@Dennis Williamson: No, non è così. Prova 'echo -n a> a.txt; echo -n b> b.txt; cat a.txt b.txt'. – ephemient

+0

@ephemient: 'echo" some text "> text.txt; file text.txt; echo -n "some text"> text.txt; file text.txt' –

risposta

35

basta usare awk

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

Love this. L'ho adattato per produrre un commento in modo da poter dire da quale file proviene ogni sezione del nuovo file: awk 'FNR == 1 {printf ("#% s \ n", ARGV [ARGIND])} 1' Grazie per l'introduzione io ad awk. Sto combinando i file .coffee in modo da evitare l'uso del caffè --merge e quindi ottenere una mappa sorgente funzionante. – Julian

+1

Suggerire la seguente modifica per non includere un'interruzione di riga nella parte superiore dei risultati: 'awk 'FNR == 1 && NR! = 1 {print" "} 1' * .txt' –

7
for file in *.txt 
do 
    cat "$file" 
    echo 
done > newfile 
17

È possibile scorrere ogni file con un ciclo for:

for filename in *.txt; do 
    # each time through the loop, ${filename} will hold the name 
    # of the next *.txt file. You can then arbitrarily process 
    # each file 
    cat "${filename}" 
    echo 

# You can add redirection after the done (which ends the 
# for loop). Any output within the for loop will be sent to 
# the redirection specified here 
done > output_file 
+1

Ciò strozzerà sui file che hanno uno spazio nel nome del file. –

+0

@IgnacioVazquezAbrams - grazie per il promemoria (non uso spazi nei miei nomi, quindi di solito lo dimentico). Ad ogni modo, ho aggiornato il mio esempio per gestirlo correttamente. –

+0

Ho scelto la soluzione awk, ma questo sarà sicuramente utile per altri script. Grazie. – Marco

6

sto supponendo che si desidera un'interruzione di linea tra i file.

for file in *.txt 
do 
    cat "$file" >> result 
    echo >> result 
done 
23

Se si dispone di un paste che lo supporta,

paste --delimiter=\\n --serial *.txt 

fa un ottimo lavoro

+2

Questo è uno dei metodi più veloci di file concatenazione che abbia mai provato Ottima idea ... – retrography

+0

IMO migliore soluzione. Entrambi '-d' e' -s' sono specificati in posix, quindi non ci dovrebbe essere un 'paste' che non li supporta. Questa soluzione ha davvero bisogno di più voti. – kralyk

+0

+1 eccellente! Grazie mille. domanda esatta che ho avuto e il perfetto ans! – KillBill

Problemi correlati