2010-05-27 4 views
2

Actuellement, j'utilise ce qui suit pour diviser un fichier en mots - Y at-il un moyen plus rapide?Scinder une chaîne par un saut de ligne et un espace dans le shell Bourne

while read -r line 
do 
    for word in $line 
    do 
     words="${words}\n${word}" 
    done 
done 
+0

@Dennis Williamson: Y at-il une raison que vous avez retiré l'étiquette 'bash'? Je me rends compte que bash est différent de sh, mais étant donné qu'il y a 2500 questions étiquetées dans le premier et un énorme 5 dans le dernier, il me semble être plus utile d'avoir les deux étiquettes. Toutes les réponses jusqu'à présent s'appliqueraient aux deux coquilles. –

+0

L'étiquette «shell» est directement applicable et permet d'obtenir une visibilité. Vous avez posé des questions sur le shell Bourne dans votre titre. J'aurais pu donner une réponse spécifique à Bash en fonction de votre tag et vous n'auriez pas pu l'utiliser avec des obus non-Bash. Notez que si vous avez utilisé "bourne" au lieu de "bourne-shell", il y a encore plus de 27 questions marquées avec cela. Certains d'entre eux ne se chevauchent probablement pas, mais la plupart ou tous devraient le faire. Si tel était le cas, une étiquette pourrait être éliminée en réduisant l'encombrement des étiquettes du site et en améliorant la visibilité pour les deux (même si ce n'est que légèrement). –

Répondre

9

Que pensez-vous de l'utilisation de tr?

tr -s '[:space:]' '\n' < myfile.txt 

Le -s serre à plusieurs caractères d'espacement en une seule.

+1

+1 pour cette solution. Un détail mineur: Utilisez \\ n, "\ n" ou "\ n" à la place du \ –

+0

+1 non cité, certainement la solution la plus rapide – l0b0

2
xargs -n 1 echo <myfile.txt 
+0

Merci, mais cette solution est plus lente que les autres. – l0b0

2
sed 's/[[:space:]]/\n/g' file.txt 
Questions connexes