2017-10-08 5 views
1

J'ai un énorme fichier texte brut (~ 500 Go) sur la machine Linux. Je veux le remplacer une chaîne dans la ligne d'en-tête (la première ligne du fichier), mais toute la méthode que je connais semble être lente et faible efficacité.Le moyen le plus rapide de remplacer la chaîne dans la première ligne de l'énorme fichier dans la ligne de commande linux?

exemple de fichier:

foo apple cat 
1 2 2 
2 3 4 
3 4 6 
... 

sortie fichier attendu:

bar apple cat 
1 2 2 
2 3 4 
3 4 6 
... 

sed:

sed -i '1s/foo/bar/g' file 

-i can c changer le fichier en place, mais cette commande génère un fichier tmp sur le disque et utilise le fichier tmp pour remplacer le fichier original. Le temps perdu.


vim:

ex -c '1s/foo/bar/g' -c 'wq' file 

vim ne génère pas un fichier tmp, mais cet outil charger tout le fichier dans la mémoire, ce qui gaspille beaucoup de temps non plus.


Y a-t-il une meilleure solution qui lit uniquement la première ligne en mémoire et l'écrit dans le fichier d'origine? Je savais que la commande linux head peut extraire la première colonne très rapidement.

+0

Veuillez ajouter l'entrée d'échantillon et la sortie désirée pour cet exemple d'entrée à votre question. – Cyrus

+2

Cela ne peut être fait que si 'foo' et' bar' ont la même longueur (en octets). Sinon, réécrire le fichier entier est votre seule option (bien que cela puisse être fait sur place si l'outil est assez intelligent). – Thomas

+0

@cyrus J'avais ajouté l'exemple. –

Répondre

0

Pourriez-vous s'il vous plaît essayer la commande awk suivant et laissez-moi savoir si cela vous aide, je ne pouvais pas le tester car je n'ai pas un fichier de grande taille comme 500 Go. Pour sûr, il ne devrait pas créer de fichier temporaire dans le backend car il n'utilise pas de substitution inplace sur Input_file.

awk 'FNR==1{$1="bar";print;next} 1' Input_file > temp_file && mv temp_file Input_file 
+0

Merci @ RavinderSingh13. Cette commande peut traiter ce problème, mais il n'y a aucune amélioration de la vitesse. Comme Thomas l'a suggéré, il n'y a peut-être pas de meilleure façon de le faire, à moins de garder la longueur de la piqûre inchangée. –