2017-09-05 1 views
0

J'ai un fichier texte comme celui-ci:AWK Group par après n nombre de lignes

lqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqk 
xtable_name  xcolumn_name  xother_info x 
tqqqqqqqqqqqqqqqqqqnqqqqqqqqqqqqqqqqqnqqqqqqqqqqqqqu 
xqs_tab1   xcol01   xblahblah01 x 
xqs_tab1   xcol02   xblahblah02 x 
xqs_tab1   xcol03   xblahblah03 x 
xqs_tab2   xcol09   xblahblah04 x 
xqs_tab2   xcol01   xblahblah05 x 
xqs_tab2   xcol02   xblahblah06 x 
xqs_tab2   xcol03   xblahblah07 x 
xqs_tab2   xcol04   xblahblah08 x 
xqs_tab2   xcol05   xblahblah09 x 
xqs_tab2   xcol06   xblahblah10 x 
xqs_tab3   xcol01   xblahblah11 x 
xqs_tab3   xcol02   xblahblah12 x 
mqqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqj 

Je voudrais obtenir un nombre de colonnes dans chaque table comme ceci:

qs_tab1, 3 
qs_tab2, 7 
qs_tab3, 2 

Après avoir lu une question similaire sur ce forum, j'ai créé le script suivant:

#!/bin/sh 
awk ' 
BEGIN { FS=" x";} 
{ 
    tablename[$1]++; 
} 
END { for (i in tablename) { 
     print tablename[i], i; 
     } 
} 
' 

Cela m'obtient la plupart du chemin, mais je voudrais manquer les 3 premières rangées et la dernière rangée.

J'ai essayé de mettre des instructions de type if (NR > 3) à différents endroits, mais j'ai toujours des erreurs.

Je voudrais également éviter le premier "x" dans chaque rangée - cependant ceci est moins un problème.

Répondre

2

Vous voulez mettre votre condition (s) devant le bloc de code qui ajoute au tableau tablename[]:

#!/bin/sh 
awk ' 
BEGIN { FS=" x"; } 
NR > 3 { tablename[$1]++; } 
END { for (i in tablename) { 
     print tablename[i], i; 
     } 
} 
' 

Cela va sauter les 3 premières lignes. Sauter le dernier n'est pas si simple cependant. Pour ce faire, nous créons une nouvelle variable pour contenir la valeur que nous ajoutons au tableau jusqu'à l'enregistrement suivant. Ensuite, lorsque nous arrivons à la dernière ligne, le script se termine et cette dernière ligne ne frappe jamais le tableau. Vous pouvez penser comme un tampon, ce qui est souvent ce que je nomme cette variable, ici que je vais le nommer « firstfield » car il semble approprié:

#!/bin/sh 
awk ' 
BEGIN { FS=" x" } 
NR > 4 { tablename[firstfield]++ } 
NR > 3 { firstfield=$1 } 
END { for (i in tablename) { 
     print tablename[i], i; 
     } 
} 
' 

Maintenant, nous avons cet ensemble variable d'être firstfield, mais ne pas être utilisé jusqu'à la prochaine itération/enregistrement/ligne pour awk, sautant effectivement la dernière ligne.