Kezdőoldal » Számítástechnika » Programozás » Ért valaki bash-ben script...

Ért valaki bash-ben script íráshoz? Segítség kellene.

Figyelt kérdés
2017. márc. 16. 22:25
1 2
 1/13 anonim ***** válasza:

Í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.

2017. márc. 16. 23:10
Hasznos számodra ez a válasz?
 2/13 A kérdező kommentje:

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.

2017. márc. 16. 23:45
 3/13 A kérdező kommentje:

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.

2017. márc. 16. 23:52
 4/13 anonim ***** válasza:

"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

:

2017. márc. 17. 00:57
Hasznos számodra ez a válasz?
 5/13 A kérdező kommentje:
Azért hiányozhatsz, mivel nemtudom másolni a szerverről. ;) Így csak ide begépeltem gyorsan. De lefut.
2017. márc. 17. 01:03
 6/13 A kérdező kommentje:
Azért nem produkálja az elvárt kimenetet, mivel nekem a greppelésbe teljesen más dolgok vannak beírva. A fájlt nemt tudom küldeni, így csak ....-ot írtam oda, mivel az irreleváns.
2017. márc. 17. 01:03
 7/13 A kérdező kommentje:

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

2017. márc. 17. 01:07
 8/13 anonim válasza:

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. :)

2017. márc. 18. 12:16
Hasznos számodra ez a válasz?
 9/13 A kérdező kommentje:
Sajnos nem használható a $() csoportosítás. Rém egyszerű lenne az egész feladat, ha már az awk-ot lehetne használni, de nem.
2017. márc. 18. 13:33
 10/13 anonim válasza:

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ó.

2017. márc. 18. 14:57
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!