Question

Je dois traiter des fichiers texte dans une sélection hétéroclite de formats. Voici un exemple (les colonnes A et B sont délimitées par des tabulations):

A   B
a   Name1=Val1, Name2=Val2, Name3=Val3
b   Name1=Val4, Name3=Val5
c   Name1=Val6, Name2=Val7, Name3=Val8

Les fichiers peuvent avoir ou non des en-têtes, des schémas de délimitation mixtes, des colonnes avec des paires nom / valeur comme ci-dessus, etc.

J'ai souvent le besoin ponctuel d'extraire des données de tels fichiers de différentes manières. Par exemple, à partir des données ci-dessus, je souhaiterais peut-être que la valeur associée à Name2 soit présente. c'est-à-dire

A   B
a   Val2
c   Val7

Quels outils / techniques existe-t-il pour effectuer des manipulations telles que des commandes à une ligne, en utilisant ce qui précède à titre d'exemple mais qui peut être étendu à d'autres cas?

Était-ce utile?

La solution

Je n'aime pas trop Sed, mais ça marche pour de telles choses:

var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename

vous donne:

 A B
 a Val2
 c Val7

Autres conseils

Vous disposez de toutes les commandes de base du shell bash, telles que grep, cut, sed et awk. Vous pouvez également utiliser Perl ou Ruby pour des tâches plus complexes.

D'après ce que j'ai vu, je commencerais par Awk pour ce genre de chose, puis si vous aviez besoin de quelque chose de plus complexe, je passerais à Python.

Je voudrais utiliser sed:

   # print section of file between two regular expressions (inclusive)
   sed -n '/Iowa/,/Montana/p'             # case sensitive

Puisque vous avez cygwin, j'irais avec Perl. C'est le moyen le plus facile à apprendre (consultez le livre O'Reily: Learning Perl ) et largement applicable.

Je voudrais utiliser Perl. Ecrivez un petit module (ou plusieurs) pour traiter les différents formats. Vous pouvez ensuite exécuter des Perlin Oneliners en utilisant cette bibliothèque. Exemple pour ce qu'il serait se présente comme suit:

perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'

Ne me citez pas sur la syntaxe, mais c'est l'idée générale. Abstenez-vous de la tâche à accomplir pour vous permettre de penser en termes de tâches à effectuer et non de tâches à accomplir. Ruby serait une autre option, il a tendance à avoir une syntaxe plus propre, mais l’une ou l’autre langue fonctionnerait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top