combiner plusieurs fichiers texte et supprimer les doublons
Que j'ai autour de 350 fichiers texte (et chaque fichier est d'environ 75 MO). J'essaie de combiner tous les fichiers et supprimer des entrées en double. Le fichier est au format suivant:
ip1,dns1
ip2,dns2
...
J'ai écrit un petit script shell pour ce faire
#!/bin/bash
for file in data/*
do
cat "$file" >> dnsFull
done
sort dnsFull > dnsSorted
uniq dnsSorted dnsOut
rm dnsFull dnsSorted
Je suis en train de faire ce traitement souvent et je me demandais si il n'y a rien que je puisse faire pour améliorer le traitement prochaine fois quand je le lance. Je suis ouvert à tout langage de programmation et des suggestions. Merci!
vous pouvez également donner tri -m a essayer --> il va trier les fichiers et de les fusionner en conséquence ils devraient donc économiser un peu de temps .... l'option-m est disponible pour l'esp n'scénario comme celui-ci ... c'est à dire de tri -m fichier* | uniq -u
OriginalL'auteur drk | 2013-06-01
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'êtes pas en utilisant toute la puissance de
cat
. La boucle peut être remplacé par justeen supposant que le fichier est vide au départ.
Puis il y a tous ces fichiers temporaires qui force les programmes d'attendre pour les disques durs (généralement le plus lent des pièces dans les systèmes informatiques modernes). L'utilisation d'un pipeline:
C'est encore un gaspillage depuis
sort
seul peut faire ce que vous utilisezcat
etuniq
pour l'ensemble du script peut être remplacé parSi ce n'est toujours pas assez rapide, puis se rendent compte que le tri prend O(n lg n) le temps tandis que la déduplication peut être fait en temps linéaire avec Awk:
Notez que la dernière awk peut être simplifié à
awk '!a[$0]++' data/*
J'ai supprimé mon perl répondre parce que 350 * 75 MO = plus de 26GB - en mémoire de tri (comme awk) peut causer trop de la mémoire d'échange.
Désolé, ce n'awk '!un[$0]++'? Il rivalise le premier élément, soit l'intégralité de la ligne?
OriginalL'auteur Fred Foo