Question

J'essaie de nettoyer certaines données et j'aimerais éventuellement les mettre au format CSV.

J'ai utilisé des expressions régulières pour le nettoyer, mais je suis bloqué sur une étape.

Je voudrais remplacer tout, sauf un tiers (\ n) par une virgule.

Les données ressemblent à ceci:

field1
field2
field3
field1
field2
field3

etc ..

J'en ai besoin dans

field1,field2,field3
field1,field2,field3

Quelqu'un a-t-il un moyen simple de faire cela en utilisant sed ou awk? Je pourrais écrire un programme et utiliser une boucle avec un compteur de mods pour effacer tous les 1er et 2e caractères de nouvelle ligne, mais je préférerais le faire depuis la ligne de commande si possible.

Était-ce utile?

La solution

Avec awk:

awk '{n2=n1;n1=n;n=
awk '{l=l<*>;if(NR%3==0){print l;l=""}else{l=l","}}END{if(l!=""){print substr(l,1,length(l)-1)}}' yourData.txt
;if(NR%3==0){printf"%s,%s,%s\n",n2,n1,n}}' yourData.txt

Ce script enregistre les trois dernières lignes et les imprime toutes les trois lignes. Malheureusement, cela ne fonctionne qu'avec des fichiers ayant un multiple de 3 lignes.

Un script plus général est:

<*>

Dans ce cas, les trois dernières lignes sont concaténées dans une seule chaîne, le séparateur de virgule étant inséré chaque fois que le numéro de ligne n'est pas un multiple de 3. À la fin du fichier, la chaîne est imprimée si elle n'est pas vide. avec la virgule de fin supprimée.

Autres conseils

Version Awk:

awk '{if (NR%3==0){print <*>;}else{printf "%s,", <*>;}}'

Une solution Perl un peu plus courte et qui gère les fichiers ne comportant pas un multiple de 3 lignes:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt

fichier cat | perl -ne 'chomp (); print $ _,! (++ $ i% 3)? " \ n " : " ;; '

Utilisez nawk ou / usr / xpg4 / bin / awk sur Solaris :

awk 'ORS=NR%3?OFS:RS' OFS=, infile

Cela pourrait fonctionner pour vous:

paste -sd',,\n' file

ou ceci:

sed '$!N;$!N;y/\n/,/' file

version vim:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g

awk '{ORS = NR% 3? ",": "\ n" "print}' urdata.txt

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top