Sortiranje i filtriranje
Cilj lekcije: Naučiti kako da koristite sort, uniq, cut, tr i paste za efikasnu obradu tekstualnih podataka u terminalu.
sort — sortiranje linija
Komanda sort sortira linije tekstualnog fajla ili standardnog ulaza.
Abecedno sortiranje (podrazumevano)
sort gradovi.txt
Ako gradovi.txt sadrži:
Novi Sad
Beograd
Niš
Kragujevac
Rezultat:
Beograd
Kragujevac
Niš
Novi Sad
Numeričko sortiranje — opcija -n
Bez -n, brojevi se sortiraju kao tekst (leksikografski — slovo po slovo, kao u recniku: ABC vs ABD), što daje pogrešan redosled:
# Pogrešno — leksikografski
echo -e "10
2
100
20" | sort
# Izlaz: 10 100 2 20
# Ispravno — numerički
echo -e "10
2
100
20" | sort -n
# Izlaz: 2 10 20 100
Obrnuto sortiranje — opcija -r
sort -n -r rezultati.txt
Kombinovanje -n i -r daje numeričko sortiranje od najvećeg ka najmanjem.
Sortiranje po koloni — opcija -k
Kada fajl ima više kolona, možete sortirati po određenoj koloni:
# Sortiranje po drugoj koloni
sort -k2 zaposleni.txt
Primer sadržaja zaposleni.txt:
Ana Petrović 35
Marko Jovanović 28
Milica Nikolić 42
# Sortiranje po trećoj koloni (starost), numerički, obrnuto
sort -k3 -n -r zaposleni.txt
Rezultat:
Milica Nikolić 42
Ana Petrović 35
Marko Jovanović 28
Separator kolona — opcija -t
Za CSV fajlove ili podatke sa posebnim separatorom, koristite -t:
# Sortiranje CSV fajla po drugoj koloni (cena)
sort -t',' -k2 -n proizvodi.csv
Primer proizvodi.csv:
laptop,85000,5
tastatura,3500,20
mis,1200,50
monitor,45000,8
Rezultat (sortirano po ceni):
mis,1200,50
tastatura,3500,20
monitor,45000,8
laptop,85000,5
Uklanjanje duplikata pri sortiranju — opcija -u
sort -u gradovi.txt
Sortira i istovremeno uklanja duplikate.
uniq — uklanjanje duplikata
Komanda uniq uklanja uzastopne duplikate iz sortirane liste.
Važno:
uniquklanja samo uzastopne duplikate. Fajl mora biti prethodno sortiran da biuniqispravno funkcionisao!
Osnovna upotreba
sort gradovi.txt | uniq
Brojanje pojavljivanja — opcija -c
sort gradovi.txt | uniq -c
Primer izlaza:
3 Beograd
1 Kragujevac
2 Novi Sad
Broj ispred svake linije pokazuje koliko puta se ta vrednost pojavljuje.
Prikazivanje samo duplikata — opcija -d
sort gradovi.txt | uniq -d
Prikazuje samo linije koje se ponavljaju.
Prikazivanje samo unikatnih linija — opcija -u
sort gradovi.txt | uniq -u
Prikazuje samo linije koje se pojavljuju tačno jednom.
cut — izvlačenje kolona
Komanda cut izvlači određene kolone ili karaktere iz svake linije.
Po separatoru — opcija -d i -f
Polje je jedan deo linije razdvojen razdelnikom (delimiter). Na primer, linija marko,beograd,123 ima 3 polja razdvojena zarezom: marko je $1, beograd je $2, 123 je $3.
# Izvuci prvu kolonu iz CSV fajla (separator: zarez)
cut -d',' -f1 proizvodi.csv
Rezultat:
laptop
tastatura
mis
monitor
# Izvuci prvu i treću kolonu
cut -d',' -f1,3 proizvodi.csv
Rezultat:
laptop,5
tastatura,20
mis,50
monitor,8
Opseg kolona
# Kolone od 2 do 4
cut -d',' -f2-4 podaci.csv
# Kolone od 3 do kraja
cut -d',' -f3- podaci.csv
Po broju karaktera — opcija -c
# Prvih 10 karaktera svake linije
cut -c1-10 fajl.txt
# Karakteri od 5 do 15
cut -c5-15 fajl.txt
Praktični primer: izvlačenje korisničkih imena iz /etc/passwd
cut -d':' -f1 /etc/passwd
tr — zamena i brisanje karaktera
Komanda tr (translate) zamenjuje ili briše pojedinačne karaktere.
Zamena karaktera
# Zameni sve male u velika slova
echo "hello world" | tr 'a-z' 'A-Z'
# Izlaz: HELLO WORLD
# Zameni velika u mala slova
echo "LINUX JE ODLICAN" | tr 'A-Z' 'a-z'
# Izlaz: linux je odlican
# Zameni tačku-zarez sa zarezom (konverzija formata)
cat podaci.txt | tr ';' ','
Brisanje karaktera — opcija -d
# Ukloni sve cifre iz teksta
echo "tel: 011-123-456" | tr -d '0-9'
# Izlaz: tel: --
# Ukloni sve razmake
echo "r a z m a k" | tr -d ' '
# Izlaz: razmak
Sazimanje ponavljanja (squeezing) — opcija -s
Sazimanje ponavljanja (squeezing) — vise uzastopnih istih znakova svodi na jedan:
# Zameni više uzastopnih razmaka jednim
echo "previše razmaka" | tr -s ' '
# Izlaz: previše razmaka
Praktični primer: normalizacija CSV separatora
# Fajl sa tabulatorima, konvertuj u CSV sa zarezima
cat tabovi.tsv | tr '\t' ','
paste — spajanje fajlova po kolonama
Komanda paste spaja linije iz više fajlova horizontalno (za razliku od cat koji spaja vertikalno).
Osnovna upotreba
Ako imate dva fajla:
imena.txt:
Ana
Marko
Milica
prezimena.txt:
Petrović
Jovanović
Nikolić
paste imena.txt prezimena.txt
Rezultat:
Ana Petrović
Marko Jovanović
Milica Nikolić
Prilagođeni separator — opcija -d
paste -d',' imena.txt prezimena.txt
Rezultat:
Ana,Petrović
Marko,Jovanović
Milica,Nikolić
Spajanje linija iz jednog fajla — opcija -s
paste -s -d',' gradovi.txt
Spaja sve linije jednog fajla u jednu liniju razdvojenu zarezima.
Kombinovanje komandi — pipeline
Prava snaga ovih alata dolazi do izražaja kada se kombinuju.
prodaja.csv:
datum,grad,proizvod,kolicina,cena
2024-01-15,Beograd,laptop,2,85000
2024-01-16,Novi Sad,tastatura,5,3500
2024-01-17,Beograd,mis,10,1200
2024-01-18,Niš,laptop,1,85000
2024-01-19,Beograd,monitor,3,45000
2024-01-20,Novi Sad,laptop,2,85000
# Koji gradovi su kupovali laptop?
grep "laptop" prodaja.csv | cut -d',' -f2 | sort | uniq
Rezultat:
Beograd
Niš
Novi Sad
# Koliko transakcija po gradu?
tail -n +2 prodaja.csv | cut -d',' -f2 | sort | uniq -c | sort -rn
Rezultat:
3 Beograd
2 Novi Sad
1 Niš
Rezime
| Komanda | Opcija | Šta radi |
|---|---|---|
sort |
(bez opcija) | Abecedno sortiranje |
sort |
-n |
Numeričko sortiranje |
sort |
-r |
Obrnuto sortiranje |
sort |
-k N |
Sortiranje po N-toj koloni |
sort |
-t ',' |
Postavljanje separatora kolona |
sort |
-u |
Sortiranje + uklanjanje duplikata |
uniq |
(bez opcija) | Uklanja uzastopne duplikate |
uniq |
-c |
Broji pojavljivanja |
uniq |
-d |
Prikazuje samo duplikate |
cut |
-d',' -f2 |
Izvlači drugu kolonu (separator: zarez) |
cut |
-c1-10 |
Izvlači karaktere 1 do 10 |
tr |
'a-z' 'A-Z' |
Konvertuje u velika slova |
tr |
-d '0-9' |
Briše cifre |
tr |
-s ' ' |
Sazimanje uzastopnih razmaka u jedan |
paste |
f1.txt f2.txt |
Spaja fajlove po kolonama |
paste |
-d',' |
Prilagođeni separator |
U sledećoj lekciji ćemo naučiti sed — moćan alat za automatsku izmenu teksta u fajlovima.