J'ai besoin de modifier quelques fichiers texte (une sortie de sar
) et de les convertir en fichiers CSV.
Je dois changer chaque espace (peut-être un onglet entre les nombres de la sortie) en utilisant des fonctions sed ou awk (un script Shell simple sous Linux).
Quelqu'un peut-il m'aider? Chaque commande que j'ai utilisée n'a pas changé le fichier du tout; J'ai essayé gsub
.
tr ' ' ',' <input >output
Remplace chaque espace par une virgule. Si vous le souhaitez, vous pouvez effectuer une passe avec le drapeau -s (répétitions squeeze), qui remplace chaque séquence d'entrée d'un caractère répété répertorié dans SET1 (l'espace vide) par une seule occurrence de celle-ci personnage.
Utilisation des répétitions squeeze utilisées après les onglets de substitution:
tr -s '\t' <input | tr '\t' ',' >output
Essayez quelque chose comme:
sed 's/[:space:]+/,/g' orig.txt > modified.txt
La classe de caractères [: space:] correspondra à tous les espaces (espaces, tabulations, etc.). Si vous voulez juste remplacer un seul caractère, par exemple. juste de l'espace, utilisez-le seulement.
EDIT: En fait, [: espace:] inclut le retour chariot, ce qui peut ne pas faire ce que vous voulez. Ce qui suit va remplacer les tabulations et les espaces.
sed 's/[:blank:]+/,/g' orig.txt > modified.txt
comme le fera
sed 's/[\t ]+/,/g' orig.txt > modified.txt
Dans tout cela, vous devez faire attention à ce que les éléments de votre fichier séparés par des espaces ne contiennent pas leurs propres espaces que vous souhaitez conserver, par exemple. deux mots.
sans regarder votre fichier d'entrée, seulement une supposition
awk '{$1=$1}1' OFS=","
rediriger vers un autre fichier et renommer au besoin
Qu'en est-il quelque chose comme ceci:
cat texte.txt | sed -e 's/\s/,/g' > texte-new.txt
(Oui, avec quelques tâches inutiles; nous pourrions aussi utiliser <pour lire directement dans le fichier, je suppose - utilisé en premier par cat pour afficher le contenu du fichier, et seulement après, j'ai ajouté sed à ma ligne de commande )
EDIT: Comme @ ghostdog74 l'a souligné dans un commentaire, il n'y a définitivement pas besoin de thet cat/pipe; vous pouvez donner le nom du fichier à sed:
sed -e 's/\s/,/g' texte.txt > texte-new.txt
Si "texte.txt" est ainsi:
$ cat texte.txt
this is a text
in which I want to replace
spaces by commas
Vous obtiendrez un "texte-new.txt" qui ressemblera à ceci:
$ cat texte-new.txt
this,is,a,text
in,which,I,want,to,replace
spaces,by,commas
Je n'irais pas simplement remplacer l'ancien fichier par le nouveau (pourrait être fait avec sed -i, si je me souviens bien; et comme @ ghostdog74 l'a dit, celui-ci accepterait de créer la sauvegarde à la volée): Garder peut être judicieux, par mesure de sécurité (même si cela implique de le renommer comme suit: "texte-backup.txt")
Cette commande devrait fonctionner:
sed "s/\s/,/g" < infile.txt > outfile.txt
Notez que vous devez rediriger la sortie vers un nouveau fichier. Le fichier d'entrée n'est pas modifié en place.
sed peut faire ceci:
sed 's/[\t ]/,/g' input.file
Cela enverra à la console,
sed -i 's/[\t ]/,/g' input.file
éditera le fichier sur place
Voici un script Perl qui éditera les fichiers sur place:
Perl -i.bak -lpe 's/\s+/,/g' files*
Les espaces consécutifs sont convertis en une seule virgule.
Chaque fichier d’entrée est déplacé vers .bak
Ces options de ligne de commande sont utilisées:
-i.bak
éditer sur place et faire des copies .bak
-p
boucle autour de chaque ligne du fichier d'entrée, affiche automatiquement la ligne
-l
supprime les nouvelles lignes avant traitement et les rajoute après
-e
exécuter le code Perl
Si vous souhaitez remplacer une séquence arbitraire de caractères vides (tabulation, espace) par une virgule, utilisez les éléments suivants:
sed 's/[\t ]+/,/g' input_file > output_file
ou
sed -r 's/[[:blank:]]+/,/g' input_file > output_file
Si certaines de vos lignes d'entrée incluent des espaces, qui sont redondants et n'ont pas besoin d'être converties en virgules, commencez par les supprimer, puis convertissez les caractères vides restants en virgules. Dans ce cas, utilisez ce qui suit:
sed 's/ +//' input_file | sed 's/[\t ]+/,/g' > output_file