J'ai un énorme fichier texte qui ressemble à ceci:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,3
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,8
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,12
La sortie souhaitée est la suivante:
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-03
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-08
36,53,90478,0.58699759849,0.33616,4.83449759849,0.0695335954050315,MI-14
36,53,15596,0.58454577855,0.26119,2.24878677855,0.116147072052964,MI-12
J'ai essayé d'autres publications pertinentes ici et sur d'autres communautés, mais je n'ai pas pu obtenir exactement ce que je veux.
MISE À JOUR
C'est la question croisée (je voulais des réponses Unix / perl et des solutions batch / powershell pour cela.) Qui a des réponses intéressantes.
"1 2 3 4" | awk '{$2=$2;print $0}'
donne:1 2 3 4
(il ne reste qu'un espace (ou OFS) entre les champs). ex2)echo "1,,,2,3,,,,4" | awk -F',' '{$2=$2;print $0}'
donne:1 2 3 4
(les virgules sont devenues des espaces). Il pourrait y avoir d'autres effets secondaires. Testez et adoptez une autre approche (gsub sur une variable de copie de $ 0, par exemple) si l'attribution d'un champ a des effets secondaires néfastes.Vous pouvez essayer d'utiliser
awk
:la source
Voici la solution Perl:
L'
-a
indicateur nous permet de traiter l'entrée comme un tableau, en fonction du séparateur spécifié avec-F
. Fondamentalement, nous modifions le dernier élément de ce tableau et le reconstruisons via lajoin
commande.la source
sprintf
l'idée centrale de votre réponse. Pas comme si ce n'était pas bien, juste ne pas proposer quelque chose de différent de la réponse acceptée. +1 de toute façon.sprintf()
est utilisée généralement lors de l'écriture d'une chaîne de format spécifique dans une variable, c'est pourquoi elle est utilisée dans de nombreuses autres langues. Je peux également l'écrire en Python - Python n'en a pas,sprintf()
mais l'idée de base sera la même, en écrivant une chaîne formatée dans une variable. Alternativement, nous pouvons opérer directement sur les éléments du tableau et simplement les imprimer. Avec ce type de questions, il y a une quantité limitée de solutions, c'est essentiellement ce que j'essaie de direAvec des données d'entrée comme:
dans text.csv
le code ci-dessous
produit une sortie comme:
la source
Tcl
Voici ma solution, faite en utilisant Tcl qui lit à partir du fichier input.csv et met le résultat dans le fichier output.csv
manifestation
la source