Sziasztok!
Van egy fájlom, melyből két oszlopot íratok ki:
cat file.txt |awk '{print $6,$8}' |sort -k1
év-hónap-nap file1
év-hónap-nap file2
év-hónap-nap file3
év-hónap-nap file4
év-hónap-nap file5
a gondom ott kezdődik, ha uniq-ot használok az ismétlődések megszámolására:
cat file.txt |awk '{print $6,$8}' |sort -k1 |uniq -c
sajnos mindenhol csak egy db-ot talál, de ha csak egy oszlopot használok (dátumosat), akkor megszámolja szépen.
Hogy tudnám megadni az uniq-nak, hogy hagyjon figyelmen kívül minden más oszlopot, csak a dátumosat számolja?
köszönöm
Még egy gyors kérdés:
van egy oszlopom, ami 10 karakterből áll, de csak az első négy karaktert szeretnem kiíratni, ezt hogy oldanátok meg, persze bash nyelven,
köszönöm
- 5096 megtekintés
Hozzászólások
Miután leírtad a megoldást, mi a kérdés?
ha csak egy oszlopot használok (dátumosat), akkor megszámolja szépen
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
a gond az, hogy kell mind a két oszlop, de ha szerepel mind a két oszlop, akkor nem számolja meg a dátumos oszlop ismétlődéseket:(
- A hozzászóláshoz be kell jelentkezni
Ha az awknak beadod a mezőelválasztót, úgy sem? (nekem már volt olyan, hogy anélkül nem ment valamim)
awk 'BEGIN\
{FS=" "}\
{print $6,$8}'
vagy 1 sorban
awk 'BEGIN {FS=" "}{print $6,$8}'
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
up
- A hozzászóláshoz be kell jelentkezni
Whaccup?
- A hozzászóláshoz be kell jelentkezni
van egy oszlopom, ami 10 karakterből áll, de csak az első négy karaktert szeretnem kiíratni, ezt hogy oldanátok meg, persze bash nyelven, de már megoldódott
- A hozzászóláshoz be kell jelentkezni
a='1234567890'; echo "${a::4}"
1234
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Tudom, hogy bash-megoldast kerdezett, igy (erdemeid elismerese mellett) csak a hordozhatosag okan:
a='1234567890'; echo "${a%${a#????}}"
1234
- A hozzászóláshoz be kell jelentkezni
Ez a sorminta tetszik :-D Még próbálom emészteni... :)
- A hozzászóláshoz be kell jelentkezni
"${valtozo#XXX}"
"${valtozo%YYY}"
A # eseten a valtozo ertekenek elejebol vagjuk le XXX-et, % eseten a valtozo ertekenek vegebol YYY-t. XXX es YYY onmagat jelento normal, es shell joker-karakterek (?, *, [..]) - tehat nem regexp, hanem amit a shell filenev megadasanal elfogad (hivatalosan: globbing) is lehetnek (a?b*). Ossze is lehet oket kombinalni, mint fentebb latszik. Nyilvan 413 karakter levagasanal ez nem tul elegans.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, ma is érdemes volt erre járnom :)
- A hozzászóláshoz be kell jelentkezni
ez tényleg komoly :D
- A hozzászóláshoz be kell jelentkezni
végül így:
cut -b 5-10 --complement valami.txt
vagy
cut -b 1-4 valami.txt
- A hozzászóláshoz be kell jelentkezni
Egy pár soros példán megmutathatnád, hogyan kellene kinéznie az általad elvárt eredménynek?
- A hozzászóláshoz be kell jelentkezni
az azonos dátummal rendelkezőket szeretném megszámolni
2012-08-31 file1
2012-08-31 file2
2012-08-31 file3
2012-08-31 file4
2012-08-31 file5
2012-08-31 file6
2012-08-31 file7
2012-09-01 file8
2012-09-02 file9
2012-09-02 file10
2012-09-03 file11
a jó eredmény valahogy így festene:
7 2012-08-31 file
1 2012-09-01 file
3 2012-09-02 file
a fájl nem fontos, csak a dátum
- A hozzászóláshoz be kell jelentkezni
Akkor ennyi elég neked:
awk ' { sum[$6]++; }
END { for(i in sum) {
print sum[i], i;
}
}' file.txt
Azaz minden bemenő sorra egy asszociatív tömb megfelelő elemét növeli, majd az utolsó bemenő sor után a tömbelem értékét és a tömbindexet (ami a sorok hatodik mezője) kiírja.
- A hozzászóláshoz be kell jelentkezni
> a fájl nem fontos, csak a dátum
Akkor hagyd ki az awk -ból, és jó lesz :-)
- A hozzászóláshoz be kell jelentkezni
a[zzz]$ cat valami.txt
2012-08-31 file1
2012-08-31 file2
2012-08-31 file3
2012-08-31 file4
2012-08-31 file5
2012-08-31 file6
2012-08-31 file7
2012-09-01 file8
2012-09-02 file9
2012-09-02 file10
2012-09-03 file11
a[zzz]$ cat valami.txt | awk 'BEGIN {FS=" "}{print $1,"file"}'| sort -k1 |uniq -c
7 2012-08-31 file
1 2012-09-01 file
2 2012-09-02 file
1 2012-09-03 file
a[zzz]$
aszem ugyanaz az eredmény
- A hozzászóláshoz be kell jelentkezni
Persze, hiszen a sorok csak a dátumban térhetnek el, a második mező mindenütt azonos, nem úgy, mint a bemeneti fájlban. Itt kell sort, a tisztán awk-os (sum[$1]++) megoldáshoz meg nem.
- A hozzászóláshoz be kell jelentkezni
Akkor én most itt ne értem magát a feladatot.
Csendben figyelek..
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
"a fájl nem fontos, csak a dátum"
Akkor hagyd ki :-)
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Valami ilyesmi?
~$ head tmp/lista.file
NEM NEM NEM NEM NEM a NEM bla_a
NEM NEM NEM NEM NEM f NEM bla_f
NEM NEM NEM NEM NEM a NEM bla_a
NEM NEM NEM NEM NEM b NEM bla_b
NEM NEM NEM NEM NEM g NEM bla_g
NEM NEM NEM NEM NEM c NEM bla_c
NEM NEM NEM NEM NEM d NEM bla_d
NEM NEM NEM NEM NEM b NEM bla_b
NEM NEM NEM NEM NEM d NEM bla_d
NEM NEM NEM NEM NEM d NEM bla_d
~$ awk ' { print $6, $8 }' tmp/lista.file |
sort -k1 |
awk ' { sum[$1]++; sor[$1]=sor[$1]" "$2; }
END { for(i in sum) {
print sum[i], i, sor[i];
}
}' | sort -n
1 c bla_c
2 b bla_b bla_b
3 a bla_a bla_a bla_a
3 f bla_f bla_f bla_f
4 d bla_d bla_d bla_d bla_d
4 e bla_e bla_e bla_e bla_e
6 g bla_g bla_g bla_g bla_g bla_g bla_g
~$
- A hozzászóláshoz be kell jelentkezni
A uniq -c helyett:
rev | uniq -c --skip-fields=1 | rev
- A hozzászóláshoz be kell jelentkezni
Annak ellenére, hogy ez a sor végére teszi a számlálókat, nagyon tetszik a szellemessége.
- A hozzászóláshoz be kell jelentkezni
Bazz, tényleg, ez elkerülte a figyelmemet... Bár az nem volt kitétel, hogy az elejére kell, hogy kerüljön a számláló :)
Akkor módosítás, kis RTFM után:
uniq -c -w 10
Azt eredményezi, hogy csak 10 karaktert vesz figyelembe - persze ehhez minden sornak YYYY-MM-DD módon kell kezdődnie.
- A hozzászóláshoz be kell jelentkezni
Az indítód és a 9:46-kor írt válaszod üti a 9:26-kor leírt válaszodat.
Vagy fontos az a fájlnév mező, vagy nem. Ha csak annyira fontos, hogy legyen ott valami, akkor az eredeti feldolgozásból helyből ki kellett volna dobni (ahogy utaltak rá), és csak az eredmény kiírásakor odahazudni valamit.
Más kérdés, hogy zeller kolléga awk-only megoldásánál egyszerűbb és rövidebb nincs... és mellesleg az is ezt csinálja.
Egyébként a problémád azonosan egyenlő azzal a dilemmával, ami az SQL group by-jának használatakor fordul elő, ha a csoportosítás alapjául szolgáló mezőn kívül az eredménytáblába emelsz egyéb oszlopokat is.
- A hozzászóláshoz be kell jelentkezni
Fapad (update.: mert az awk-hoz nem érteni), de én ezt gondoltam hirtelen.:
for i in `seq 1 10`; do dat=$(date +%F -d-"$i"day); ls | grep $dat | wc -l && echo $dat
udv
letix
-----------------------------------------
Linux alapparancsok, kezdőknek
- A hozzászóláshoz be kell jelentkezni
Azaz n-darab (jelen esetben tíz darab) date, ls, grep, wc... És még Chokito-nak sem lehet mondani, mert bár ronda, de nagyon nem finom :-D
- A hozzászóláshoz be kell jelentkezni
Nincs ezzel gond, általában az ilyen randaságoktól indul el a zember fia a szépségek felé vezető sokstációs, ám soha véget nem érő úton.
Sárga, savanyú, de az övé, és ez az utóbbi értékelendő.
- A hozzászóláshoz be kell jelentkezni
Jogos. :)
Szegényes a repertoár, azokat tudtam használni, amiket eddig megismertem.
Ez az awk kellemes kis eszköz, át fogom tanulmányozni.
udv
letix
-----------------------------------------
Linux alapparancsok, kezdőknek
- A hozzászóláshoz be kell jelentkezni
ö litöl help:
- A hozzászóláshoz be kell jelentkezni
Koszi!
-----------------------------------------
Linux alapparancsok, kezdőknek
- A hozzászóláshoz be kell jelentkezni
Picit bővebben: http://www.gnu.org/software/gawk/manual/ én a pdf-et kinyomtattam/beköttettem - így egészen baráti költséggel lett egy jó awk-s könyvem :-D
- A hozzászóláshoz be kell jelentkezni
Megtettem volna én is - meg is teszem minden mással -, de amíg a fenti fordításával végeztem, elég okafogyottá vált a dolog. ;)
- A hozzászóláshoz be kell jelentkezni
:-D Neked lehet, hogy okafogyott a dolog, de másnak jól jöhet a kézikönyv.
- A hozzászóláshoz be kell jelentkezni