2013-03-04 2 views
1

J'ai plusieurs milliers de fichiers et ils contiennent chacun une seule ligne très longue. Je veux les convertir tous en un seul fichier avec une entrée par ligne divisée dans les champs ID et cela fonctionne avec quelques fichiers, mais cela prend trop de temps sur des centaines de fichiers et semble planter sur des milliers de fichiers. Vous cherchez un moyen plus rapide et illimité.Parse milliers de fichiers xml avec awk

(find -type f -name '*.xml' -exec cat {} \;) | awk '{gsub("ID","\nID");printf"%s",$0}' 

J'ai aussi essayé ..

(find -type f -name '*.xml' -exec cat {} \;) | sed 's/ID/\nID/g' 

Je pense que le problème est d'essayer d'utiliser le remplacement au lieu d'insertion ou il utilise trop de mémoire.

Merci

Répondre

2

Je ne peux pas le tester avec des milliers de fichiers, mais au lieu de cat toutes les données en mémoire avant de les traiter avec awk, essayez d'exécuter awk avec certains de ces fichiers à la fois, comme :

find . -type f -name "*.xml*" -exec awk '{gsub("ID","\nID");printf"%s",$0}' {} + 
+1

Merci les gars. Ma pipe coule à travers maintenant. J'ai l'impression d'avoir débloqué le secret de l'univers. –

1
  1. Créer une liste de tous les fichiers dont vous avez besoin pour traiter
  2. Diviser cette liste en petites listes comprenant chacun 50 fichiers
  3. Créer un script qui lit une sous-liste et fournit un intermédiaire fichier, faire la chose ID aussi
  4. créer un autre script qui exécute le script dans 3, 20 processus à la fois, autant que nécessaire, en arrière-plan des processus
  5. fusionner les fichiers de sortie