Posterous theme by Cory Watilo

Filed under: awk

De az élet szép

S az awk-mat felhívtam,

És emlékül nekem ezt a zajt írtam, óóó…

 

awk 'BEGIN {split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",month, " "); while(++i in month) {m[month[i]]=i} } { mym=gensub(/^[^ ]+ ([^ ]+).*$/,"\\1","g",$0); print gensub(/^[^ ]+ ([^ ]+) ([0-9]+) ([0-9]+):([0-9]+):([0-9]+) [^ ]+ ([0-9][0-9][0-9][0-9])\..*$/, "\\6 " sprintf("%02i",m[mym]) " \\2 \\3 \\4 \\5","g",$0) }'

És ha 10 millió majom használna AWK-t?

Cross posted from Proggit. Though they don't show self-posts there, so it is good as dead. Copy and paste to terminal and enjoy!

awk 'function wl() {rate=4000; return int((rate/160)*(0.87055^(int(rand()*10))))}; BEGIN {srand(); wla=wl(); while(1) {wlb=wla; wla=wl(); if (wla==wlb) wla*=2; d=(int(rand()*10+5)*rate/4); a=0; b=0; c=128; ca=40/wla; cb=20/wlb; de=rate/10; di=0; for (i=0;i<d;i++) {a++; b++; di++; c+=ca; c+=cb; if (a>wla) {a=0; ca*=-1}; if (b>wlb) {b=0; cb*=-1}; if (di>de) {di=0; ca*=0.9; cb*=0.9}; printf("%c",c)}; c=int(c); while(c!=128) {c<128?c+=1:c-=1; printf("%c",c)};};}' > /dev/dsp

If you run OSSv4, use rate=64000 Someone with a better sense of pitch might want to find rate numbers that are more in tune. If it stutters on your computer (though you'd need to have a Pentium 2 for this to happen) use mawk instead.

It uses a pentatonal scale, so it'll probably sound slightly out of tune no matter what you do.

It is also my first awk script, go easy on me. Improvements welcome.

Edit: formatted for your viewing pleasure.

awk 'function wl() {\
        rate=4000; \
        return int((rate/160)*(0.87055^(int(rand()*10))))}; \
    BEGIN {\
        srand(); \
        wla=wl(); \
        while(1) {\
            wlb=wla; \
            wla=wl(); \
            if (wla==wlb) \
                wla*=2; \
            d=(int(rand()*10+5)*rate/4); \
            a=0; b=0; c=128; \
            ca=40/wla; cb=20/wlb; \
            de=rate/10; di=0; \
        for (i=0;i<d;i++) {\
            a++; b++; di++; c+=ca; c+=cb; \
            if (a>wla) \
                {a=0; ca*=-1}; \
            if (b>wlb) \
                {b=0; cb*=-1}; \
            if (di>de) \
                {di=0; ca*=0.9; cb*=0.9}; \
            printf("%c",c)}; \
        c=int(c); \
        while(c!=128) {\
            c<128?c+=1:c-=1; \
            printf("%c",c)};};}' > /dev/dsp

AWK ami SQL-t generál, ami SED-t generál

{
        HSZSZ=substr($0,26,24)
        BISTA=substr($0,166,1)
        STAK=substr($0,311,3)
        BBD=substr($0,319,11)
        if ( STAK=="UJ " && BISTA != "A" && ( BBD == 0 || BBD ~ /^ *$/ ) ) {
                print "select '" NR " s/^\\(.
\\{296\\}\\).\\{11\\}/\\1'||to_char(x.insur_fee,'999999999.00')||'/' from TABLA x where giro_acct = '" HSZSZ "';"
        }
}

És elsőre jól működött. Még betehettem volna az automatikus sqlplus és sed hívást. De mindennek van határa... 

 

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.