Gnezdenje v BASHu

Enter4 Član
uredil/-a 6. April, 2013 v Programiranje
Ker mi žal nikakor ne uspe najti "pametne" rešitve, se obračam na vas.
Rad bi spisal skripto v bashu, ki bi fajl z vsebino spodaj

ime1 554846
ime2 751896
ime3 48975641
ime1 874651231
ime4 874562
ime2 421185
ime1 8545441
ime2 58875521

izpisala nekako takole(ali vsaj podobno)

ime1
554846
874651231
8545441
=3

ime2
751896
421185
58875521
=3

ime3
48975641
=1

ime4
874562
=1

Upam, da nisem preveč zakompliciral oz. da si ne želim preveč :)

Hvala in lep pozdrav.

Komentarji

  • Kaj si pa naredu do zdaj? :)

    zadevo si razdeliš na več korakov.. recimo
    [list=*]
    [*]prvi korak.. preberi vsebino fajla ter jo izpiši..[/*]
    [*]drugi korak izpiši samo imeX[/*]
    [*]tretji korak preštej koliko je imeX ter izpiši število imeX ter samo imeX[/*]
    [/list]

    in tako počasi stopnjuješ dokler na koncu nimaš spisane cele seminarske ;)
  • Sicer počnem nekako tako, vendar mi zmeraj nekaj zmanka :D

    zadeve sem se hotel lotit tako:

    cat datoteka | grep \"uporabnik=\" | awk -F \" \" {'print $3\" \"$7'}


    in dobim ven tole
    ime1 554846
    ime2 751896
    ime3 48975641
    ime1 874651231
    ime4 874562
    ime2 421185
    ime1 8545441
    ime2 58875521
    če pogledam zadevo iz strani kakšnega pythona ali phpja... bi tukaj spustil čez kakšno for zanko, nekaj spremenljivk in bi dobil želen rezultat. Ampak, da bi ponovno izpisoval "datoteko" in čez spuščal while, for... se mi zdi slaba ideja.

    Zato me je zanimalo, če se da npr. v awkju med {'print $...'} poljem vpeljat še kakšen sort, uniq -c?
  • bash pozna tud array() :)
  • Pa naredi vse v awku. gawk ima vgrajeno funkcijo za sortiranje, štetje pa itak ne bi smelo bit problem.
  • kaj počneš s temi printi $3 pa $7 ? pa tudi ne vem čemu grepaš za "uporabnik=" če tega ni notri :)

    cat datoteka|sort    
    pa imaš posortirane
  • Urko je dejal/-a:
    Pa naredi vse v awku. gawk ima vgrajeno funkcijo za sortiranje, štetje pa itak ne bi smelo bit problem.
    Se nagibam k tej smeri :)
    CrazyLemon je dejal/-a:
    kaj počneš s temi printi $3 pa $7 ? pa tudi ne vem čemu grepaš za "uporabnik=" če tega ni notri :)

    cat datoteka|sort    
    pa imaš posortirane
    tisto kar sem izpisal zgoraj je le rezultat, ki sem ga dobil s pomočjo grepanja in awkja $3, 7
  • že..ampak praviš da je so v fajlu stringi "imeX 221314321" etc.. čemu grepaš "uporabnik=" ? in kaj ti sprinta awk z $3 ter $7 ??
  • tretji in sedmi stolpec (pri čemer so ločniki polj presledku podobni znaki).
  • LP,
    je to OK?

    xxx@xxx:~$ cat dokument.txt
    ime1 554846
    ime2 751896
    ime3 48975641
    ime1 874651231
    ime4 874562
    ime2 421185
    ime1 8545441
    ime2 58875521


    $ for i in `cat dokument.txt | sort | awk '{print $1}' | uniq`; do echo $i; cat dokument.txt | grep $i | awk '{print\" \"$2}'; echo \" =\"`cat dokument.txt | grep $i | wc -l`; echo -e \"\"; done;

    ime1
    554846
    874651231
    8545441
    =3

    ime2
    751896
    421185
    58875521
    =3

    ime3
    48975641
    =1

    ime4
    874562
    =1
  • grdo, da boli. :o

    pa nagrado za UUoC si zaslužiš. ;)
  • sej lahko razbiješ v več vrstic :), če te pa cat moti :)

    xxx@xxx:~$ for i in `sort dokument.txt | awk '{print $1}' | uniq`; do echo $i; grep $i dokument.txt | awk '{print\" \"$2}'; echo \" =\"`grep $i dokument.txt | wc -l`; echo -e \"\"; done;
  • CrazyLemon je dejal/-a:
    že..ampak praviš da je so v fajlu stringi "imeX 221314321" etc.. čemu grepaš "uporabnik=" ? in kaj ti sprinta awk z $3 ter $7 ??
    CrazyLemon, vidim, da ti števili 3 in 7 nikakor nista pri srcu :) drugače je pa izpis imeX 221314321 že rezultat, ki ga vrneta grep in awk.
    johnnyyy je dejal/-a:
    sej lahko razbiješ v več vrstic :), če te pa cat moti :)

    xxx@xxx:~$ for i in `sort dokument.txt | awk '{print $1}' | uniq`; do echo $i; grep $i dokument.txt | awk '{print\" \"$2}'; echo \" =\"`grep $i dokument.txt | wc -l`; echo -e \"\"; done;
    uuuuu johnnyyy to je pa za veliko pivo ;) :cool: :cool:

    Hvala ti 1000x ;)
  • In isto, samo z/ awkom:


    cat e.awk
    {
    a[$1]=a[$1]\"\n \"$2
    b[$1]++
    }
    END{
    for(i in a){
    print i\" \"a[i]
    print \" =\"b[i]\"\n\"
    }
    }



    cat enter4
    ime1 554846
    ime2 751896
    ime3 48975641
    ime1 874651231
    ime4 874562
    ime2 421185
    ime1 8545441
    ime2 58875521



    awk -f e.awk enter4
    ime1
    554846
    874651231
    8545441
    =3

    ime2
    751896
    421185
    58875521
    =3

    ime3
    48975641
    =1

    ime4
    874562
    =1

  • tinkster, tudi tebi 1000x hvala;)

    Tudi za ostale skripte bom v bodoče izhajal iz AWKja :D
  • Če ti jih bodo drugi pisali.. pol boš zihr :cool:
  • LemonCrazy, načeloma ne ;)

    oz. po pravici povedano niti prvi niti drugi post ne bom uporabil neposredno... gre se le zato, da ne bi gnezdil v pythonu. ;)
Za komentiranje se prijavite ali pa se vpišite.