2013-03-04 5 views
0

j'ai des fichiers assez larges avec des colonnes séparées par des tabulations:colonnes d'impression dans un motif récurrent avec awk

Donna 25.07.83 Type1 A B C D E F G H .... 
Adam 17.05.78 Type2 A B C D E F G H .... 

Je voudrais imprimer tout, mais après la troisième colonne imprimer un onglet toutes les deux colonnes. .

Donna 25.07.83 Type1 AB CD EF GH .... 
Adam 17.05.78 Type2 AB CD EF GH .... 

Je pense qu'il ya probablement un moyen plus intelligent de le faire que

awk '{OFS="\t"} {print $1, $2, $3, $4$5, $6$7, $8$9}' 

et ainsi de suite, p articulairement parce que mes fichiers ont plus de 1000 colonnes en eux. Est-ce que awk peut faire ça?

Répondre

1

Tout à fait dégueu, mais fonctionne:

awk '{printf "%s\t%s\t%s",$1,$2,$3; for(i=4;i<=NF;i+=2) printf "\t%s%s",$i,$(i+1); print ""}' wide.txt 

NF est une variable awk dont la valeur est un nombre qui vous indique le nombre colonnes de la ligne courante a. Vous le trouverez dans le manuel.

Nous allons le démonter:

#!/usr/bin/awk -f 

{ 
    printf "%s\t%s\t\%", $1, $2, $3; # print the first 3 columns, explicitly 
            # separated by TAB. No NEWLINE will be printed. 

    # We want to print the remaining columns in pairs of $4$5, $6$7 

    for(i = 4; i <= NF ; i+=2)  # i is 4, then 6, then 8 ... till NF (the num. of the final column) 
    printf "\t%s%s", $i, $(i+1); # print \t$4$5, then \t$6$7, then \t$8$9 

    print ""       # We haven't print the end-of-line NEWLINE 
            # yet, so this empty print should do it. 
} 
+0

Merci, je trouve un peu difficile à suivre mais je peux voir le « % s \ t% s Les bits \ t% s "appartiennent à printf et sont éventuellement destinés à l'impression des onglets. Je pourrais avoir à regarder dans le NF dans la documentation awk comme ci-dessus je ne suis pas complètement. Merci – jksl

1
awk '{for(i=1;i<=NF;i++){if(i>=4){$i=$i$(i+1);$(i+1)="";i+=1}}print}' your_file 

testé:

> cat temp 
Donna 25.07.83 Type1 A B C D E F G H 
Adam 17.05.78 Type2 A B C D E F G H 
> awk '{for(i=1;i<=NF;i++){if(i>=4){$i=$i$(i+1);$(i+1)="";i+=1}}print}' temp 
Donna 25.07.83 Type1 AB CD EF GH 
Adam 17.05.78 Type2 AB CD EF GH 
+0

Merci, je vais l'utiliser demain. Puis-je demander ce qu'est la partie NF et le bit avec l'itération? – jksl

Questions connexes