shell - chat - fusionner des fichiers contenu dans un seul gros fichier
Je vais essayer, à l'aide de bash, fusionner le contenu d'une liste de fichiers (plus de 1K) dans un gros fichier.
J'ai essayé les commandes cat:
cat * >> bigfile.txt
cependant que cette commande n'est fusionner tout, inclus aussi les choses déjà fusionné.
par exemple
file1.txt
content1
file2.txt
content2
file3.txt
content3
file4.txt
content4
bigfile.txt
content1
content2
content3
content2
content3
content4
content2
mais je voudrais juste
content1
content2
content3
content4
à l'intérieur de l' .fichier txt
L'autre moyen serait cat file1.txt file2.txt ...
et ainsi de suite... mais je ne peux pas le faire pour plus de 1k de fichiers!
Merci pour votre soutien!
OriginalL'auteur fabioln79 | 2012-05-24
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous mettez
bigfile
dans le même répertoire, et donc faire partie de*
. Donc, quelque chose commedoit travailler comme vous le voulez, avec votre
fileN.txt
fichiers situés dansdir/
cat * >/tmp/bigfile; mv /tmp/bigfile .
.Je pense que fabioln est volontairement y compris
bigfile.txt
dans l'entrée; il veut ajouter le fichier à partir de différentsfile*.txt
, mais en éliminant les doublons dans le même temps.Merci les gars. Oui, c'était le problème! J'ai mis le bigfile dans le même dir... j'ai donc utilisé la commande que vous m'avez donné (cat dir/* > bigfile)! Juste une autre question: pourquoi vous mettez juste > au lieu de >> est-il le même? Merci!!!!
à l'aide de
>>
vous ajouter la sortie vers le fichier, à l'aide de>
remplacement de la totalité du contenu.Dépend de ce que votre "droit" de l'ordre; le shell va étendre
*
par ordre alphabétique dans l'ordre de tri, voir serverfault.com/a/122743OriginalL'auteur mvds
Vous pouvez garder le fichier de sortie dans le même répertoire, vous avez juste à être un peu plus sophistiqué que
*
:Avec la quantité d'information fournie, pensez que ce pourrait être dû à l'espace réellement utilisé contre la taille de Bloc (Lire sur ce dernier)
OriginalL'auteur glenn jackman
Sur la re-lecture de votre question, il apparaît que vous souhaitez ajouter des données à
bigfile.txt
, maissans ajout de doublons. Vous aurez à passer à travers tout
sort -u
de filtrer les doublons:La
-o
option de tri vous permet, en toute sécurité inclure le contenu debigfile.txt
dans l'entrée, de sorte avant de le fichier est écrasé à la sortie.EDIT: en Supposant que bigfile.txt est triée, vous pouvez essayer un processus en deux étapes:
Nous avons d'abord trier les fichiers d'entrée, la suppression des doublons. Nous tuyau de sortie à l'autre
sort -u
processus, celui-ci à l'aide de la-m
option qui ditsort
de fusionner les deux précédemment triées fichiers. Les deux fichiers, nous allons fusionner sont-
(l'entrée standard, les flux en provenance de la premièresort
), etbigfile.txt
lui-même. Nous avons de nouveau utiliser le-o
option afin de nous permettre d'écrire la sortie de retour àbigfile.txt
après que nous avons lu en entrée.bigfile.txt
de telle manière qu'il reste trié, pas de doublons introduit. Je pense que c'est le meilleur que vous pouvez faire sans avoir à passer à un format plus structuré (base de données).OriginalL'auteur chepner
C'est ce que xargs est pour:
xargs exécute la commande une fois que tous les arguments, vous n'avez pas besoin d'utiliser
'>>'
.Merci pour la clarification. La page de man n'était pas très clair pour moi.
OriginalL'auteur Barton Chittenden
C'est une vieille question, mais encore, je vais donner une autre approche avec
xargs
liste les fichiers que vous souhaitez concat
Examen de vos fichiers dans le bon ordre avec
vi
oucat
. Si vous utilisez un suffixe (1, 2, 3, ..., N), cela ne devrait poser aucun problèmeCréer le fichier final
Supprimer la liste des fichiers
Espère que cela aide quelqu'un
OriginalL'auteur Alwin Kesler
Essayer:
Je n'ai pas de machine unix à portée de main au moment de le tester pour vous d'abord.
ls
lorsque le générique déjà se développe pour les fichiers que vous voulez! N'utilisez pas non cotées noms de fichiers (la sortie de la backticks), car il se décompose si les noms de fichiers contiennent des espaces.J'étais en train de penser d'une boucle quand j'ai écrit ça, mais il n'est pas sorti de ma tête correctement. J'aime Barton la réponse de mieux de toute façon.
OriginalL'auteur JerseyMike