2010-04-05 5 views
23

J'utilise cat * .txt pour fusionner plusieurs fichiers txt en un, mais j'ai besoin que chaque fichier soit sur une ligne séparée.Linux: Fusion de plusieurs fichiers, chacun sur une nouvelle ligne

Quelle est la meilleure façon de fusionner des fichiers avec chaque fichier apparaissant sur une nouvelle ligne?

+0

'cat' fait que par défaut. –

+7

@Dennis Williamson: Non, ce n'est pas le cas. Essayez 'echo -n a> a.txt; echo -n b> b.txt; chat a.txt b.txt'. – ephemient

+0

@ephemient: 'echo" du texte "> text.txt; fichier text.txt; echo -n "du texte"> text.txt; file text.txt' –

Répondre

35

il suffit d'utiliser awk

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

J'adore ça. Je l'ai adapté pour produire un commentaire afin que je puisse dire de quel fichier provient chaque section du nouveau fichier: awk 'FNR == 1 {printf ("#% s \ n", ARGV [ARGIND])} 1' Merci d'avoir introduit moi à l'égarer. Je combine des fichiers .coffee pour que je puisse éviter le --merge du café et obtenir ainsi une carte source fonctionnelle. – Julian

+1

Suggère la modification suivante pour ne pas inclure un saut de ligne en haut des résultats: 'awk 'FNR == 1 && NR! = 1 {print" "} 1' * .txt' –

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

Vous pouvez parcourir chaque fichier avec une boucle:

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

Cela va s'étouffer sur les fichiers qui ont un espace dans le nom de fichier. –

+0

@IgnacioVazquezAbrams - merci pour le rappel (je n'utilise pas d'espaces dans mes noms, donc je l'oublie habituellement). Quoi qu'il en soit, j'ai mis à jour mon exemple pour gérer cela correctement. –

+0

J'ai choisi la solution awk, mais elle sera certainement utile pour d'autres scripts. Merci. – Marco

6

Je suppose que vous voulez un saut de ligne entre les fichiers.

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

Si vous avez un paste qui le soutient,

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

fait un travail vraiment super

+2

C'est l'une des méthodes les plus rapides du fichier concaténation j'ai déjà testé. Bonne idée ... – retrography

+0

IMO meilleure solution. '-d' et' -s' sont posix-spécifiés, donc il ne devrait pas y avoir 'paste' ne les supportant pas. Cette solution a vraiment besoin de plus de votes. – kralyk

+0

+1 excellent! merci un million. question exacte j'avais et les ans parfaites! – KillBill

Questions connexes