Šta je novo?

awk

  • Začetnik teme Deleted member 9456
  • Datum pokretanja
D

Deleted member 9456

Guest
Zelim iz fajla da izvadim sve cisto munericke slogove
1. Ovo polovicno radi izvadi i numerike koji su deo alfanumerika
Kod:
cat ulaz.txt | awk '($1)==(($1)*1) {print $1}' > izlaz.txt
2. Preporuceno na netu, probao sam prvu varijantu izvadio je neke gluposti a ne numerik, dalje nisam probao jer me ne zanima
Kod:
awk '$5 ~ /^[0-9]+$/ {print $1}'   is an unsigned integer
 
 awk '$9 ~ /^[+-][0-9]+$/ {print $1}' is a signed integer

 awk '$NF ~ /^[+-][0-9]*\.[0-9]+$/ {print $1}' is a signed float

3. probao ovo ali dobijem sve numerike zajedno u beskonacnom nizu
cat ulaz.txt | tr -cd '[:digit:]' > izlaz.txt
 
Da ne pominjem bazu ponovo hahah, daj primer par redova pa da probamo nešto. Da li mora awk obavezno?
 
Snimi kod odavde http://pastebin.com/6XAx2ydb u fajl "main.py" i pokreni sa

Kod:
python main.py INPUT_FAJL

U direktorijumu u kom se nalaziš ćeš dobiti fajl "output.txt" koji će sadržati samo one linije koje su cele sastavljene od brojeva. To sve pod uslovom da sam dobro shvatio šta želiš :)
 
Da to je to, hvala :). Kad sam sa cat listao neke velike fajlove video sam da ima istih tih numerckih slogova, da bi se uverio bilo mi je potrebno ovako nesto.
 
Evo ti čisto bash rešenje, ako nećeš da pozivaš python i awk:

cat ulaz.txt | egrep -o '\b[0-9]+\b'

To ti je ako hoćeš svaki broj da se pojavi u zasebnoj liniji. Ako bi radije recimo da budu odvojeni razmakom, možeš da upotrebiš tr da "prevedeš" znak za novi red u nešto drugo:

cat ulaz.txt | egrep -o '\b[0-9]+\b' | tr '\n' ' '
 
Poslednja izmena:
Hvala to sam trazio, nasao sam bio egrep ali da svaki broj bude posebna linija nisam znao da izvedem, nabadao sam nesto al nisam uspeo.
 
I jos samo izbaci taj 'cat'. egrep takodje prihvata ime fajla kao argument.
Pozdrav
 
Kod:
cat ulaz.txt | egrep -o '\b[0-9]+\b'
Probao nije ok, ovo izvlaci sve sto pocinje sa numerikom, ako je alfanumerik tj. pocinje sa numerikom makar to bila sam jedna cifra a ostalo slova to izvuce tu jednu cifru. Treba da izvuce samo cist numerik kao sto radi python program koji je napisao @Neky.
 
Meni radi, ako je to ovo što želiš da postigneš. Redovi gde postoje SAMO numerički znakovi.
egrep je grep sa EXTENDED (ERE).
Kod:
ovuckovic@ibmP4:~/PRIVgrep$ egrep -o '\b[0-9]+\b' test.txt 
01246794486
01246794487
01246794488
01246794489
01246794490
01246794491
01246794492
01246794493
01246794494
01246794516
01246794517
01246794518
ovuckovic@ibmP4:~/PRIVgrep$ grep -E -o '\b[0-9]+\b' test.txt 
01246794486
01246794487
01246794488
01246794489
01246794490
01246794491
01246794492
01246794493
01246794494
01246794516
01246794517
01246794518
 
dodaj u test fajl ovo i onda ne pije vodu a kod mene ko za q bas to ima
0`\.#)\&
0^={,%),
0=%/%`;?
0-!$^^.=
0-([,`!_
0,,;%!,:
0;`\,$"!
0;//=-=_
0:$"`[+\
0!}!{)%^
0???????
 
Ovo lutanje podseca me na neki seminar koji sam slusao, sve predavac objasni ali meni za obradu iz prakse treba bas nesto trece. Ovo radi ali nece kad su ovi karateri-simboli onda omasuje, uzeo sam za test file koji sam generisao sa CRUNCH programom. Sad mi nije jasno kako python lepo zna da prepozna sta je celobrojna vrednost broja a sta je neka kombinacija raznih znakova a ove sve komade omasuju. Evo zaglavih do kasno trazeci po netu ali mrka kapa.:)
 
Poslednja izmena od urednika:
Resio:
Kod:
cat test.txt | awk '/^[0-9]+$/ { print $0 }' > test1.txt
 
Evo resenje za svaki moguci slucaj, kopkalo me je sta je $1 jer u primerima je bio sasvim drugacije, na jednom mestu sam nasao i sve mi je bilo jasno, $1 je prvi slog u liniji a kod mene ima bas samo jedan slog u liniji.

Kod:
 awk '$1 ~ /^[0-9]+$/' ulaz.txt > izlaz.txt  is an unsigned integer
 
 awk '$1 ~ /^[+-][0-9]+$/' ulaz.txt > izlaz.txt is a signed integer

 awk '$1 ~ /^[+-][0-9]*\.[0-9]+$/' test.txt > test4.txt is a signed float
 
 awk '$1 ~ /^[0-9]*\.[0-9]+$/' test.txt > test4.txt is a unsigned float
 
 awk '$1 ~ /^[+-][0-9]*\.[0-9]+$/ || /^[0-9]*\.[0-9]+$/' test.txt > test5.txt signed and unsigned float
 
Poslednja izmena od urednika:
Popravih onaj Python, sada radi i sa velikim fajlovima; http://pastebin.com/mFtucm2H
Pustio sam pythona fajl 10.4GB sad sistem ne leluja, pogledao sam prog vidim da nema open i close za ulazni file, da li fa je to kecalo? Cekam da zavrsi ali sad je sistem stabilan.
Zavrsilo ok, pregledao izlazni file, ok.

Prepravi sam tvoj python, tj pomerio jednu liniju tako da mi je izlazni file ostatak, sa prvim programom izvucem numerike a sa drugm ocistim ulazni file od tih numerika.
http://pastebin.com/wRimTLzp

Hvala :)
 
Poslednja izmena od urednika:
Popravio sam način na koji otvara fajl; linija koja počinje sa "with open...". Raniji način je radio na svim verzijama Pythona, ovaj radi od 2.6 pa na dalje.
 
Popravio sam način na koji otvara fajl; linija koja počinje sa "with open...". Raniji način je radio na svim verzijama Pythona, ovaj radi od 2.6 pa na dalje.
Nisam video open ulazne datoteke i close, da li je to sad nepotrebno jer je datoteka read only.
 
Na liniji 6 počinje naredba "with open" i tako dalje; tu se fajl otvara. "Ručno" zatvaranje nije potrebno jer "with" naredba automatski zatvara fajl kada se taj blok koda završi, bez obzira kako ili zašto je završen.
 
Kod:
cat ulaz.txt | egrep -o '\b[0-9]+\b'
Probao nije ok, ovo izvlaci sve sto pocinje sa numerikom, ako je alfanumerik tj. pocinje sa numerikom makar to bila sam jedna cifra a ostalo slova to izvuce tu jednu cifru. Treba da izvuce samo cist numerik kao sto radi python program koji je napisao @Neky.

Neće biti, evo sad probao i ne izvlači numerike iz mešanih alfanumeričkih "reči". Izvlači samo iz primera kao što je 0`\.#)\& jer interpunkcijski znaci nisu deo "reči". Da ih se rešiš možeš recimo ovako, koristeći dvostruki grep:

cat ulaz.txt | egrep -o '\b[0-9]+[[:punct:]]*\b' | egrep -o '[[:digit:]]+'

Dakle moguće je i bez awk, koristeći samo regular expressions.

Edit: Pardon, gornji primer je upravo ako želiš da iščerupaš brojeve iz kombinacija sa specijalnim karakterima. Ako ne želiš, onda pajpuješ u | sed '/[0-9]+[[:punct:]]+/d'
 
Poslednja izmena:
Neće biti, evo sad probao i ne izvlači numerike iz mešanih alfanumeričkih "reči". Izvlači samo iz primera kao što je 0`\.#)\& jer interpunkcijski znaci nisu deo "reči". Da ih se rešiš možeš recimo ovako, koristeći dvostruki grep:

cat ulaz.txt | egrep -o '\b[0-9]+[[:punct:]]*\b' | egrep -o '[[:digit:]]+'

Dakle moguće je i bez awk, koristeći samo regular expressions.

Edit: Pardon, gornji primer je upravo ako želiš da iščerupaš brojeve iz kombinacija sa specijalnim karakterima. Ako ne želiš, onda pajpuješ u | sed '/[0-9]+[[:punct:]]+/d'

Ok, hvala, meni je problem terminologija jer ti to nazivaz interpukciskim znacima a ja u chrunc programu u tabeli imam naziv simbol. Ja ne znam kako se ta kombinacija ponasa u fajlu, za mene je sve slog a ispade da je to kao rec deo teksta.
Ja to drugacije posmatram jer mi je ostalo tako dok sam radio sa cobolom i sql-cobol i jcl. Za mene postoje numerici, alfa, alfanumerici, simboli koji ulaze u alfa kombinaciju. Mnogo toga se meni brka u glavi. Bitno je da smo dosli do resenja i to
na vise nacina. Hvala na trudu i pojasnjenju :)
 
Nazad
Vrh Dno