Ért valaki bash-ben script íráshoz? Segítség kellene.
Írd akkor le hogy hol akadtál el, miben kéne a segítség.
De ne egy teljes (házi) feladatot akarj másokkal megoldani, mert úgy nem jutsz előre.
Van sok millió adat. Példaként írok egy ilyet:
DSFDSF,11111
GDSGDS,0000
SADAdsa,valami,valami,valami
DSFDSF 11111
GDSGDS 0000
SADAdsa,valami,valami,valami
DSFDSF 11112
GDSGDS 0001
SADAdsa,valami,valami,valami
DSFDSF 11113
GDSGDS 0000
SADAdsa,valami,valami,valami
Ebből kéne egy ilyet csinálni:
Elsőnek:
11111 0000
11111 0000
11112 0001
11113 0000
Utána:
11111 2
11112 0
11113 1
Tehát elsőnek ki kell szűrni a megfelelő adatokat, utána meg úgy rendezni, hogyha 0000-ák vannak akkor azokat számolja, de ha nem nulla az érték akkor azt ne számolja és nullának vegye.
Ezek:
DSFDSF,11111
GDSGDS,0000
SADAdsa,valami,valami,valami
Egybetartozó részek, de külön sorba vannak.
for j in `cat $1 | grep -e "....." -e "....."`
do
if [ 1 -eq `echo $j | grep -e "....." | wc -l` ]; then
VALT=`echo $j | cut -d"," -f2 | cut -d"." -f1`
VALT2=`echo $IDOK | cut -c1,2`
VALT3=`echo $IDOK | cut -c3,4`
VALT4=$VALT2\:$VAL3
fi
if [ 1 -eq `echo $j | grep -e "....." | wc -l ]; then
SE=`echo $j | cut -d"," -f8 | cut -d"." -f1`
fi
echo $VALT4 $SE
done
ez ideág lefut azt nemtudom, hogy csináljam meg azt, hogy az első adat csak egyszer szerepeljen viszont mellette ki legyen az írva, hogy hány volt, de ha mellette nem 0000 ák szerepeltek akkor viszont 0 legyen az értéke, szóval uniq -c vel nemtudom, awk meg nem használható ez a probléma.
"ez ideág lefut"
Hát, nem.
Dob egy szép hibaüzenetet:
./main.sh: sor: 13: váratlan EOF „`” helyett
./main.sh: sor: 17: szintaktikai hiba: váratlan fájlvége
A hibát a 12. sorban a wc -l után hiányzó aposztróf okozza.
Kijavítva: [link]
De ez sem épp az elvárt kimenetet produkálja:
:
:
:
: DSFDSF
: 11111
: GDSGDS
: GDSGDS
:
: DSFDSF
: 11112
: GDSGDS
: GDSGDS
:
: DSFDSF
: 11113
: GDSGDS
: GDSGDS
:
Szóval nem az általam hozott példára van írva, tehát így természetesen nem az elvárt kimenetet fogja produkálni.
A lényeg, hogy megjelenik ilyen formában a:
11111 0000
11111 0000
11112 0001
De ez így két külön változóban van. És ezzel kéne valamit kezdeni.
11113 0000
Hű, hát nem mondom, nem biztos, hogy teljesen értem mi a feladat. :)
Meg aztán itt az elírásokkal is gond van. Például a példabemenetben az első adatcsoportnál szándékosan van vessző elválasztókarakternek, vagy véletlenül?
Mindenesetre a kódod indokolatlanul bonyolult, én másképp közelíteném meg:
Már te is említetted, hogy bizonyos adatok összetartoznak, miért nem kezeljük őket akkor egységként? Tehát az összetartozó sorokat foglaljuk egységbe. A head és tail segítségével vágjuk ki a megfelelő sorokat:
for i in $(seq 1 3 $(cat "$1" | wc -l)); do
dataGroup="$(cat "$1" | tail -n +"$i" | head -n 3)"
Így a dataGroup-ban kell már csak az adatokat megszűrni, s így az "elsőknek" csoport már elő is állt:
echo "$dataGroup" | tr "\n" " " | cut -d ' ' -f "2,4"
Az Utána csoport egy különálló probléma, egy kissé trükkösebb is. Először is az elsőket sorba kell rendezni, majd a duplikációkat kidobni:
dataSet="$(echo "$elsonek" | sort -n | uniq | tr ' ' ',')"
Ebben az átmeneti változóban a szóközöket vesszőre cseréltem, hogy a for az újsorokra illessze a mezőszeparátort (lehetne még az IFS-sel bohóckodni, de az vissza tud ütni)
Ez után for-ba beletölteni a dataSet-et, és minden elemére meg kell vizsgálni, hogy a második része csupa 0-e, mert ha igen, akkor meg kell számolni, hogy az elsőkben hányszor szerepel:
first="$(echo "$i" | cut -d ',' -f 1)"
groupCount="$(echo "$elsonek" | grep "^$first " | wc -l)"
Hát valahogy így állnék neki nagy hirtelenjében. :)
Hi, Nem használok awk-t, és a $() nem csoportosítás, hanem parancs behelyettesítés, a backtick-kel (`) ekvivalens, csak manapság már a backtick-et nem használják.
További előnye a $() formulának, hogy egymásba ágyazható.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!