2009-03-12 8 views
8

J'essaye de nettoyer certaines données, et je voudrais éventuellement les mettre au format CSV.Comment joindre les n premières lignes d'un fichier

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

Je voudrais remplacer tous les tiers sauf un (\ n) avec une virgule.

Les données ressemble à ceci:

field1 
field2 
field3 
field1 
field2 
field3 

etc ..

-je besoin dans

field1,field2,field3 
field1,field2,field3 

Quelqu'un a une façon simple de le faire en utilisant sed ou awk? Je pourrais écrire un programme et utiliser une boucle avec un compteur mod pour effacer tous les 1er et 2ème caractères de nouvelle ligne, mais je préfère le faire depuis la ligne de commande si possible.

Répondre

7

Avec awk:

awk '{n2=n1;n1=n;n=$0;if(NR%3==0){printf"%s,%s,%s\n",n2,n1,n}}' yourData.txt 

Ce script enregistre les trois dernières lignes et de les imprimer à chaque troisième ligne. Malheureusement, cela ne fonctionne qu'avec des fichiers ayant un multiple de 3 lignes.

Un script plus général est:

awk '{l=l$0;if(NR%3==0){print l;l=""}else{l=l","}}END{if(l!=""){print substr(l,1,length(l)-1)}}' yourData.txt 

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

1

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

5

Version Awk:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}' 
4

Une solution Perl qui est un peu plus courte et que les fichiers poignées qui ne disposent pas d'un multiple de 3 lignes:

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

Good one sur les non-mulitple-de-trois fichiers. Je savais que le mien ne l'a pas manipulé mais n'a pas vu la solution en 3 minutes j'ai pris ceci. – jj33

0

version vim:

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

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

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

awk '{SRO = NR% 3 " ":" \ n"; print}' urdata.txt

1

Cela pourrait fonctionner pour vous:

paste -sd',,\n' file 

ou ceci:

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