2010-12-04 3 views
1

Tenir compte du schéma DB suivant:awk: façon élégante pour aller chercher le mot après un séparateur

CREATE UNIQUE INDEX blah1 ON table1(length); 
CREATE INDEX blah2 ON table3(name); 
CREATE INDEX blah3 ON table3 USING btree(id); 

Je veux écrire un petit script awk qui renverrait les noms des indices et des tables, par exemple:

blah1, table1 
blah2, table2 
blah3, table3 

J'ai besoin de faire correspondre le mot qui vient après le mot INDEX et le mot qui vient après le mot ON et se termine par ( ou des espaces.

Une idée de comment le faire en utilisant une correspondance regex, sans itération sur tout $NF s?

+0

Selon vos spécifications la troisième ligne devrait être 'blah3, table3 UTILISATION de btree' (se terminant par" (") –

+0

Merci, corrigé –

Répondre

1

Je ne sais pas bien awk, mais cela semble fonctionner:

awk 'BEGIN{ FS="INDEX | ON "}{gsub(/[ (].*/,"",$3); print $2", " $3}' test.dat 
+0

Great.Ajouté'/CREATE/&&/INDEX/'avant '{gsub .. .' pour correspondre uniquement aux lignes appropriées dans le schéma. –

0
sed 's/.*INDEX \([^ ]*\) ON \([^(]*\)[(].*/\1, \2/' inputfile 

awk '{sub(".*INDEX ","");sub(" ON ",",");sub("[(].*",""); sub(",",", ");print}' inputfile 
0

fonctionne très bien avec un Perl one-liner.

cat file | perl -ne '/INDEX ([a-zA-Z0-9]+) ON ([a-zA-Z0-9]+)/ && print "$1, $2\n";' 

Retourne ce que vous vouliez.

Questions connexes