2010-04-07 5 views
3

J'ai besoin de réorganiser un gros fichier CSV. La première colonne, qui est actuellement un nombre à 6 chiffres, doit être divisée, en utilisant des virgules comme séparateur de champs.Utilisez Awk pour imprimer chaque caractère dans sa propre colonne?

Par exemple, je dois ceci:

022250,10:50 AM,274,22,50 
022255,11:55 AM,275,22,55 

transformé en ceci:

0,2,2,2,5,0,10:50 AM,274,22,50 
0,2,2,2,5,5,11:55 AM,275,22,55 

Laissez-moi savoir ce que vous pensez!

Merci!

Répondre

3

Il est beaucoup plus court en perl:

perl -F, -ane '$,=","; print split("",$F[0]), @F[1..$#F]' <file> 

Puisque vous ne savez pas perl, une explication rapide. -F, indique que le séparateur de champ d'entrée est la virgule (comme awk). -a active le partage automatique (dans le tableau @F), -n encapsule implicitement le code dans une boucle while (<>) { ... }, qui lit l'entrée ligne par ligne. -e indique que l'argument suivant est le script à exécuter. $, est le séparateur de champ de sortie (il obtient l'itération de la boucle de cette façon, mais oh bien). split a un but évident, et vous pouvez voir comment le tableau est indexé/découpé. print, lorsque des listes en tant qu'arguments comme celui-ci, utilise le séparateur de champ de sortie et imprime tous leurs champs.

En awk:

awk -F, '{n=split($1,a,""); for (i=1;i<=n;i++) {printf("%s,",a[i])}; for (i=2;i<NF;i++) {printf("%s,",$i)}; print $NF}' <file> 
+0

Wow, j'ai besoin d'apprendre perl. Merci! – wizkid84

+2

"Perl mène aux hachages, les hachés conduisent à la haine, la haine mène à la souffrance" –

2

Je pense que cela pourrait fonctionner. La fonction split (au moins dans la version que je cours) sépare la valeur en caractères individuels si le troisième paramètre est une chaîne vide.

BEGIN{ FS="," } 
    { 
    n = split($1, a, ""); 
    for (i = 1; i <= n; i++) 
     printf("%s,", a[i]); 

    sep = ""; 
    for (i = 2; i <= NF; i++) 
     { 
     printf("%s%s", sep, $i); 
     sep = ","; 
     } 
    printf("\n"); 
    } 
+0

Je ne sais pas comment utiliser cette réponse. Peux-tu expliquer? Merci! – wizkid84

+1

@ wizkid84: Mettez le script dans un fichier (par exemple, splitit.awk) puis exécutez-le avec la commande: awk -f splitit.awk

+1

ou exécutez-le comme un seul ligne: «awk» << script va ici> > '' (de la même manière que dans ma réponse). – Cascabel

1

Voici une variation sur un thème. Une chose à noter est qu'il imprime les champs restants sans utiliser de boucle. Une autre est que, puisque vous bouclez les caractères dans le premier champ de toute façon, pourquoi ne pas le faire sans utiliser la fonction de délimiteur nul de split() (qui peut ne pas être présent dans certaines versions de AWK):

awk -F, 'BEGIN{OFS=","} {len=length($1); for (i=1;i<len; i++) {printf "%s,", substr($1,i,1)}; printf "%s", substr($1,len,1);$1=""; print $0}' filename 

Comme un script:

BEGIN {FS = OFS = ","} 
{ 
    len = length($1); 
    for (i=1; i<len; i++) 
     {printf "%s,", substr($1, i, 1)}; 
    printf "%s", substr($1, len, 1) 
    $1 = ""; 
    print $0 
} 
2

est ici une autre façon awk

$ awk -F"," '{gsub(".",",&",$1);sub("^,","",$1)}1' OFS="," file 
0,2,2,2,5,0,10:50 AM,274,22,50 
0,2,2,2,5,5,11:55 AM,275,22,55 
Questions connexes