Remplacer les espaces par une virgule dans un fichier texte sous Linux
J'ai besoin de modifier quelques fichiers de texte (une sortie de sar
) et de les convertir dans des fichiers CSV.
J'ai besoin de changer tous les espaces (c'est peut-être un onglet entre les numéros de la sortie) à l'aide de sed ou awk fonctions (un simple script shell sous Linux).
Quelqu'un peut m'aider? Chaque commande que j'ai utilisé n'a pas changé le fichier à tous; j'ai essayé gsub
.
Vous devez vous connecter pour publier un commentaire.
Substituts chaque espace avec une virgule, si vous avez besoin vous pouvez faire une passe avec l'indicateur s (squeeze répète), qui remplace chaque séquence d'entrée d'un caractère répété qui est répertorié dans SET1 (l'espace) avec une seule occurrence de ce caractère.
Utilisation de squeeze répète utilisé pour après substitut onglets:
Essayez quelque chose comme:
La classe de caractères [:space:] correspond à tous les espaces blancs (espaces, tabulations, etc.). Si vous voulez juste pour remplacer un seul caractère, par exemple. juste de l'espace, de l'utilisation que seul.
EDIT: en Fait [:space:] inclut le retour de chariot, de sorte que cela peut ne pas faire ce que vous voulez. Le suivant va remplacer les tabulations et les espaces.
comme
Dans tout cela, vous devez être attentif à ce que les éléments de votre fichier qui sont séparés par des espaces ne contiennent pas de leur propre espace que vous souhaitez conserver, par exemple. deux mots.
-r
doncsed -r "s'[[:blank:]]+','g"
\s+
de travail:sed -E 's/\s+/,/g' orig.txt > modified.txt
, mais il ne le fait pas. Et mêmesed 's/[\t ]+/,/g' orig.txt > modified.txt
ne parvient pas à correspondre à onglets. La seule commande sed qui a fonctionné pour moi a été:sed -E 's/[[:space:]]+/,/g' orig.txt > modified.txt
sans regarder votre fichier d'entrée, seulement une supposition
rediriger vers un autre fichier et renommez-le si nécessaire
{$1=$1; print}
.Ce que quelque chose comme cela :
(Oui, avec certaines inutile cat et de la tuyauterie ; peut également utiliser des < lire le fichier directement, je suppose-utilisé le chat de la première à la sortie du contenu du fichier, et seulement après, j'ai ajouté sed à ma ligne de commande)
EDIT : comme @ghostdog74 souligné dans un commentaire, il n'y a définitivement pas besoin de thet cat/pipe ; vous pouvez donner le nom du fichier à sed :
Si "texte.txt" de cette façon :
Vous obtiendrez un "texte-new.txt" qui va ressembler à ceci :
Je n'irais pas seulement de remplacer l'ancien fichier par le nouveau (qui pourrait être fait avec sed -je, si je me souviens bien ; et comme @ghostdog74 dit, ce serait accepter la création de la sauvegarde à la volée) : garder pourrait être sage, comme une mesure de sécurité (même si cela signifie avoir à renommer en quelque chose comme "texte-backup.txt")
Cette commande devrait fonctionner:
Notez que vous devez rediriger la sortie vers un nouveau fichier. Le fichier d'entrée n'est pas changé de place.
sed peut le faire:
Qui va envoyer à la console,
permettra d'éditer le fichier en place
Voici un script Perl qui va modifier les fichiers en place:
Des espaces consécutifs est convertie en une seule virgule.
Chaque fichier d'entrée est déplacée .bak
Ces options de ligne de commande sont utilisés:
-i.bak
modifier sur place et de faire .bak copies-p
boucle autour de chaque ligne du fichier d'entrée, imprimer automatiquement la ligne-l
supprime les retours à la ligne avant le traitement, et ajoute dans de retour après-e
exécuter le code perlSi vous souhaitez remplacer une suite arbitraire de caractères blancs (tab, espace) avec une virgule, utilisez la commande suivante:
ou
Si certains de vos lignes d'entrée comprennent des espaces qui sont redondantes et n'ont pas besoin d'être convertis à des virgules, puis vous devez d'abord se débarrasser d'eux, et ensuite de convertir le reste des caractères vides pour des virgules. Dans de tels cas, utilisez la commande suivante: