Posterous theme by Cory Watilo

Filed under: regex

Gyorsan azonnal megoldani

És akkor most egy sokmillió soros fájlon cseréljük ki az utolsó 'F' betűt 'N'-re, de csak akkor ha az előző sor vége is 'N' és az utolsó sor vége is 'N'.

     cp sokmiiliosorosfajl.txt{,.orig}

     vim -c "%s:^\(.\{228\}N\)\(\_..\{228\}\)F\(\_..\{228\}N\):\1\2N\3:" -c "wq" sokmiiliosorosfajl.txt &

     make coffee

I can do this, can you do that?

:'<,'>s:^\(\d\{12\}\)\s\+\([^;]\+\);\(...\);\s*$:insert into tmptablacskacska values ('\1',\2,'\3');:

És 7 másodperc múlva mind a 6 millió sor hibásan formázott CSV insert-é válotozott…

És akkor már csak az elsjére kellett beszúrni a drop & create table-t, meg néhány ezer soronként egy makróval a commit;-ot majd:

:w tmp.sql

:ConqueTermSplit bash

isqlplus tmp.sql

:q!

Melyiket szeressem, (g)awk vagy ruby

Mindkettő majdnem ugyanazt csinálja:

 

       awk '/ [A-Z]+$/ {print substr($0,1,12) substr($0,147,3) }'

       ruby -n -e 'puts $_[0,12]+$_[146,3] if /[A-Z]{3}$/' 

 

Vagyis kiírja az input sor egy részét, de csak ha a sor utolsó három karaktere (az awk esetében – ezért csak majdnem - csak az utolsó space után legalább egy karakter a sor végéig) nagybetűs. És akkor melyiket szeressem?

Az awk ennyit fut:

real    0m6.671s

user    0m3.845s

sys     0m0.547s

 

A ruby meg ennyit:

real    0m8.000s

user    0m6.165s

sys     0m0.634s

 

Persze ugyanarra a szép nagy fájlra.

 

A válasz egyszerű. Az awk szinte mindenhol van. Ez jó. Ruby csak ott, ahová direkt telepítettem. De az awk-ban csak akkor tudom pontosan megadni azt hogy három karaktert akarok pontosan ellenőrizni, ha gawk-t használok --re-interval kapcsolóval. Vagy ha így adom meg: / [A-Z][A-Z][A-Z]$/.

 

Szóval a ruby nekem erre a feladatra jobban tetszett.

Amúgy meg tök mindegy, csak kész legyen.