Parsing chaque champ et processus à l'aide de « awk »/« gawk »


0

Voici une requête:

grep bar 'foo.txt' | awk '{print $3}' 

Le nom du champ émis par la requête « awk » sont déchiquetés noms C++ symbole. Je veux passer chacun à dem et finalement sortir la sortie de 'dem'- i.e les symboles démangés.

Supposons que le séparateur de champ est un '' (espace).

1

Que diriez-vous

grep bar 'foo.txt' | awk '{ print $3 }' | xargs dem | awk '{ print $3 }' 
  0

La façon dont je lis la page dem man, les noms des symboles doivent être sur la commande l ine plutôt que stdin 22 févr.. 092009-02-22 03:56:35

  0

oups, j'ai mal lu cela. J'ai édité un appel à xargs qui devrait le réparer. 22 févr.. 092009-02-22 03:58:08

  0

bien, le côté C++ pourrait avoir des espaces en eux :) 22 févr.. 092009-02-22 04:50:33

  0

darn, j'espérais que ce ne serait pas le cas ... 22 févr.. 092009-02-22 05:02:35

  0

ouais mon truc C++ filt ne fonctionnera pas avec son (apparemment) style de mangling Sun: /. mais vous pouvez avoir de la chance que dem ne mette pas d'espaces dans le coté C++? d'après ce que les exemples montrent, il omet de montrer le type de retour, au moins 22 févr.. 092009-02-22 05:26:51


3

awk est un langage de correspondance de motif. Le grep est totalement inutile.

awk '/bar/{print $3}' foot.txt 

fait ce que votre exemple fait.

Modifier fixe un peu après avoir lu les commentaires sur la réponse de precedeing (je ne sais pas une chose à propos dem ...):

Vous pouvez utiliser l'appel system à awk avec quelque chose comme:

awk '/bar/{cline="dem " $3; system(cline)}' foot.txt 

mais cela engendrerait une instance de dem pour chaque symbole traité. Très inefficace.

permet donc obtenir plus intelligent:

awk '/bar/{list = list " " $3;}END{cline="dem " list; system(cline)}' foot.txt 

BTW - Non testé que je n'ai pas dem ou votre entrée.


Une autre pensée: si vous allez utiliser la formulation xargs offerte par d'autres affiches, cut pourrait bien être plus efficace que awk. À ce stade, cependant, vous aurez encore besoin de grep.


1

Ce imprimera les symboles demangled, complets avec des listes d'arguments dans le cas des méthodes:

awk '/bar/ { print $3 }' foo.txt | xargs dem | sed -e 's:.* == ::' 

Ce imprimera les symboles demangled, sans listes d'arguments dans le cas des méthodes:

awk '/bar/ { print $3 }' foo.txt | xargs dem | sed -e 's:.* == \([^(]*\).*:\1:' 

Cheers, V.