11
votes

Shell - Cat - Fusionner des fichiers contenus dans un grand fichier

J'essaie, à l'aide de bash, pour fusionner le contenu d'une liste de fichiers (plus de 1k) dans un gros fichier.

J'ai essayé la commande CAT suivante: P>

content1
content2
content3
content4


0 commentaires

6 Réponses :


23
votes

Le problème est que vous mettez bigfile dans le même répertoire, ce qui fait donc partie de * . Donc, quelque chose comme xxx

devrait simplement fonctionner comme vous le souhaitez, avec vos fichiers filen.txt dans dir /


6 commentaires

... ou chat *> / tmp / bigfile; MV / TMP / BIGFILE. .


Je pense que Fabioln incluait intentionnellement bigfile.txt dans l'entrée; Il veut ajouter au fichier à partir des différents fichier * .txt , mais éliminer les doublons en même temps.


Merci les gars. Oui, c'était le problème! Je mets le bigfile dans le même dir ... alors j'ai utilisé la commande que vous m'avez donnée (Cat Dir / *> Bigfile)! Une autre question: pourquoi vous mettez juste> au lieu de >> Est-ce la même chose? Merci!


@ Fabioln79 en utilisant >> Vous appendez la sortie dans le fichier, à l'aide de > vous écrasez tout le contenu.


Peut-on toujours compter sur la "notation étoile" pour fusionner les fichiers dans le bon ordre?


Dépend de votre ordre "droit"; La coquille va développer * dans ordre alphabétique, voir serverfault.com/a/122743



-3
votes

Essayez:

cat `ls -1 *` >> bigfile.txt


2 commentaires

-1 Cela ne résout rien et introduit de nouveaux problèmes. N'utilisez pas ls lorsque le Wildcard se développe déjà aux fichiers que vous voulez! N'utilisez pas les noms de fichiers non coqués (la sortie des backtsticks) car il se casse si les noms de fichier contiennent des espaces.


J'y pensais réellement à une boucle quand j'ai écrit ça, mais cela ne sortait pas de ma tête correctement. J'aime mieux la réponse de Barton.



4
votes

Lors de la ré-lecture de votre question, il semble que vous souhaitiez ajouter des données sur bigfile.txt , mais sans ajouter des doublons. Vous devrez tout transduire par trier -u pour filtrer les doublons: xxx

-O -o option pour trier vous permet de définir Inclure en toute sécurité le contenu de bigfile.txt dans l'entrée pour trier avant que le fichier soit écrasé avec la sortie.

EDIT: En supposant que BigFile.txt est trié, vous pouvez essayer un deux Processus de contournement: xxx

Nous triez d'abord les fichiers d'entrée, en supprimant les doublons. Nous conduisons cette sortie à un autre processus trier -u , celui-ci à l'aide de l'option -M , qui indique Trier pour fusionner deux fichiers triés précédemment . Les deux fichiers que nous allons fusionnerons sont - (entrée standard, le flux provenant du premier Trier ) et bigfile.txt lui-même. Nous utilisons à nouveau l'option -o pour nous permettre d'écrire la sortie sur bigfile.txt après l'avoir lu comme entrée.


1 commentaires

J'ai modifié la réponse pour permettre aux nouvelles données d'être fusionnées dans bigfile.txt de manière à ce qu'il reste trié sans doublons introduits. Je pense que c'est le meilleur que vous puissiez faire sans passer à un format plus structuré (tel qu'une base de données).



4
votes

Vous pouvez conserver le fichier de sortie dans le même répertoire, il vous suffit d'être un peu plus sophistiqué que * : xxx


2 commentaires

Merci. J'ai une question liée à cette commande: le répertoire contenant le fichier a une taille de 557GB mais le grandfile créé a une taille de 495. Je ne sais pas comment expliquer cela. Je fais quelque chose de mal? Merci!


@ Fabioln79 avec quantité d'informations fournies, suspect ceci peut être dû à l'espace effectivement utilisé la taille du bloc (lisez sur ce dernier)



2
votes

L'autre moyen serait CAT File1.txt File2.txt ... et ainsi de suite ... mais je ne peux pas le faire pour plus de 1k fichiers!

C'est ce que Xargs est pour: xxx


3 commentaires

Xargs exécute-t-il la commande pour chaque argument ? Si oui, devriez-vous utiliser '>>' au lieu de ">"? Je pense que lorsqu'il est fait, BigFile.txt ne contiendra que le contenu du dernier fichier qui lui est transmis.


Xargs exécute la commande une fois pour tous les arguments, vous n'avez pas besoin d'utiliser '>>' .


Merci pour la clarification. La page de l'homme n'était pas très claire pour moi dessus.



1
votes

C'est une question ancienne mais je vais toujours donner une autre approche avec xargs

  1. répertoriez les fichiers que vous souhaitez concatez

    ls | Grep [modèle]> Fileéliste

  2. revue vos fichiers sont dans la commande appropriée avec VI ou chat . Si vous utilisez un suffixe (1, 2, 3, ..., n) cela ne devrait pas être un problème

  3. Créer le fichier final

    Fileéliste CAT | Xargs Cat >> [Fichier final]

  4. Retirez le filéliste

    Filoconiste RM -F

    J'espère que cela aide toute personne


0 commentaires