2013-05-15 2 views
1

J'ai plusieurs (60.000) fichiers dans un dossier qui doivent être combinés en 3 fichiers distincts. Comment pourrais-je chatter cela afin que je puisse avoir chaque fichier contenant le contenu de ~ 20 000 de ces fichiers?Cat plusieurs milliers de fichiers

Je sais que ce serait comme une boucle:

for i in {1..20000} 
do 
cat file-$i > new_file_part_1 
done 
+0

Vos fichiers de sortie doivent-ils contenir le contenu de fichiers d'entrée consécutifs (par exemple, output1 contient input1, input2, ..., input20000)? –

+1

Avertissement '{1..2000}' est un astuce zsh. Préférez '\' seq 1..20000 \ '' – Vash2593

+3

@ Vash2593: c'est un Bash parfaitement valide. Ce n'est pas valable dans le shell Bourne, mais ce n'est pas ce qu'il utilise. ('seq', d'autre part, est spécifique à GNU.) – Cairnarvon

Répondre

5

Faire:

cat file-$i > new_file_part_1 

tronque new_file_part_1 chaque itération de la boucle. Vous voulez ajouter au fichier:

cat file-$i >> new_file_part_1 
+0

C'était exactement ça! Merci Kind Sir – Jcrow06

+2

@ Jcrow06 Il est courtois de cliquer sur la coche si vous pensez que cette réponse résout votre problème. – nurettin

+0

Je sais que je suis désolé, il ne me permettait pas de cocher la case qu'après un certain temps limite! – Jcrow06

0

En supposant qu'il n'a pas d'importance quel fichier d'entrée va vers lequel le fichier de sortie:

for i in {1..60000} 
do 
    cat file$i >> out$(($i % 3)) 
done 

Ce script utilise l'opérateur modulo % pour diviser l'entrée en 3 bacs; il va générer 3 fichiers de sortie:

  • out0 contient file3 file6, file9, ...
  • OUT1 contient fichier1, fichier4, File7, ...
  • OUT2 contient fichier2, fichier5, file8,. ..
4

Les autres réponses referment et ouvrent le fichier à chaque itération. Je préférerais

for i in {1..20000} 
do 
    cat file-$i 
done > new_file_part_1 

de sorte que la sortie de tous cat runs sont acheminés dans un fichier opend une fois pour toutes.

0
#!/bin/bash 

cat file-{1..20000} > new_file_part_1 

Cette lance cat qu'une seule fois et ouvre et ferme le fichier de sortie une seule fois. Aucune boucle requise, puisque cat peut accepter tous les 20000 arguments. Un observateur astucieux a noté que sur certains systèmes, les 20000 arguments peuvent dépasser la limite ARG_MAX du système. Dans un tel cas, xargs peut être utilisé, avec la pénalité que cat sera lancé plus d'une fois (mais toujours nettement moins de 20000 fois).

echo file-{1..20000} | xargs cat > new_file_part_1 

Cela fonctionne parce que, dans Bash, echo est une coque intégrée et en tant que tels ne sont pas soumis à ARG_MAX.

+0

Cela a le potentiel de générer une ligne de commande plus longue que le maximum autorisé. – chepner

+1

@chepner: J'ai d'abord inclus 'xargs' pour cela dans ma réponse, mais je l'ai enlevé parce que je l'ai senti distrait du point principal de ma réponse qui est que l'utilisation d'une boucle est une étape supplémentaire inutile. Ajouter 'xargs' à ceci est trivial. –

Questions connexes