BASH help <megoldva, köszönöm mindenkinek>

Fórumok

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

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


"${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.

Egy pár soros példán megmutathatnád, hogyan kellene kinéznie az általad elvárt eredménynek?

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[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

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 uniq -c helyett:

rev | uniq -c --skip-fields=1 | rev

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.

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.

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