2014-06-20 4 views
0

Je fichier input.txt comme ci-dessous:Comment utiliser les commandes cut et awk pour extraire du texte dans un format tabulaire?

nom: test1.v

BUG: bug 102 is fixed by some user 
IO_CHANGE: there is no io_change for this version 
FEATURE: no feature added 

nom: test2.v

BUG: bug 103 is fixed by some user 
also bug 105 is fixed 
IO_CHANGE: there is no io_change for this version 
FEATURE: yes feature number 3 also feature 23 
and feature 34 is added 

nom: test3.v

BUG: bug 104 is fixed by some user 
FEATURE: yes feature number 2 
IO_CHANGE: 

Ma question: - il y a parfois une longue description pour BUG/FEATURE/IO_CHANGE qui arrive en 2 lignes ou parfois il n'y a rien dans IO_CHANGE donc c'est vide. Le fichier de sortie devrait avoir une liste pour tous les bugs puis les fonctionnalités et les io_changes. Ces 3 types peuvent être dans n'importe quel ordre dans le fichier d'entrée, j'ai besoin de trouver tous les bogues/fonctionnalités/io_changes du fichier et de les lister en colonne.

enter image description here

Répondre

1

Comment à ce sujet. Nous stockons les valeurs dans un tableau pour chaque fichier. Ici, je concatène les entrées qui apparaissent sur plusieurs lignes.

awk 'function dump() {if (vc>0) 
     print fn, vals["BUG"], vals["FEATURE"], vals["IO_CHANGE"] 
    } 
    BEGIN {FS=":";OFS="\t";vc=0} 
    FNR==1 {dump();val=""; delete vals; fn=FILENAME; vc=0} 
    NF>1 {val=$1; vals[val]=vals[val] $2; vc++} 
    NF==1 {vals[val] = vals[val] " " $1} 
    END{dump()}' test*v 
  1. La fonction dump() est ce que écrit un enregistrement sur le fichier.
  2. Le BEGIN attribue le ":" au séparateur de champ (ainsi, les ":" ne sont pas autorisés en tant que texte dans les champs de cette solution). La sortie est délimitée par tabulation.
  3. Ensuite, au début de chaque fichier (FNR = 1), nous sauvegardons les enregistrements si nous en avons, puis nous réinitialisons ou collections.
  4. Ensuite, si une ligne a un ":" (ce qui donnerait NF> 1), nous gardons la trace de la valeur que nous définissons et la stockons dans le tableau. S'il n'y a pas de ":" (faisant NF == 1) alors nous ajoutons simplement à la dernière valeur que nous étions en train d'ajouter.
  5. Enfin, à la fin du dernier fichier, nous vidons le contenu une dernière fois.
+0

En raison du fait que vous imprimez '2' $ et en utilisant' : 'comme' FS' aucune ligne sans ':' ne sera imprimée –

+0

Merci @Jidder. J'avais un type dans la condition «NF == 1». Il efface maintenant correctement plusieurs lignes. – MrFlick

0

Définit une variable si une phrase est trouvée, si l'une des autres locutions est détectée, puis enregistre les lignes dans le tableau en fonction du nom du fichier.
Enlève tout avant: sur chaque ligne
imprime ensuite la ligne dans les colonnes

#!/bin/bash 

awk  'BEGIN{printf("%-8s%-60s%-60s%-20s\n\n","FILE","|BUG","|IO","|FEATURE")} 
    /BUG/{a=1}/IO_CHANGE:/ || /FEATURE/{a=0} {if (a){Bug[FILENAME]=Bug[FILENAME]""$0" "}} 
    /IO_CHANGE:/{b=1}/BUG/ || /FEATURE/{b=0} {if (b){IO[FILENAME]=IO[FILENAME]$0" "}} 
    /FEATURE/{c=1}/IO_CHANGE:/ || /BUG/{c=0} {if (c){Feat[FILENAME]=Feat[FILENAME]$0" "}} 
    END{ 
      for (k in Bug){ 
        Bug[k] = substr(Bug[k],index(Bug[k],":")) 
        IO[k] = substr(IO[k],index(IO[k],":")) 
        Feat[k] = substr(Feat[k],index(Feat[k],":")) 
        printf("%-8s%-60s%-60s%-20s\n\n","|"k,"|"Bug[k],"|"IO[k],"|"Feat[k])}} 
' test*v 

Malheureusement, cette impression wont plusieurs lignes pour chaque fichier

Questions connexes