bash => zeile mit trenner auslesen und jeden wert in eine fortlaufende variable schieben

  • Hallo !


    das ist quasi die Fortsetzung von hier. Ich war 4 Wochen ausser Landes und hatte danach 3 Wochen Urlaub, in der Zwischenzeit hat mein Kollege weiter "gebastelt" und nun habe ich in meinem auszuwertenden textfile noch ein paar zeilen mehr. Das sieht nun so aus:ert1_1;wert1_2;wert1_3

    Quote

    wert1_1;wert1_2;wert1_3
    wert2_1;wert2_2
    ;
    wert3_1;wert3_2;wert3_3;wert3_4

    Also es steht in jeder Zeile:
    Werte durch semikolon getrennt (wenns nur einer ist dann steht der ohne) oder kein Wert (dann steht nur ein semikolon da
    Der Punkt ist nun es kann ein oder mehrere Werte dort stehen (das ist unterschiedlich)
    und jeden Wert brauche ich in einer variable die der zeile zuordenbar ist, sprich $ZEILE1_1 $ZEILE1_2 $ZEILE2_1 die letzte Nummer ist fortlaufend...
    mit IFS das habe ich mir schon angesehen das würde schon eineinigermassen helfen, aber dann stehen die werte in einem array und wie kriege ich die dann in die variable ?


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Muss das unbedingt in der Bash sein? Das kann man z.B. in Python leicht erledigen:

    Code
    1. #!/usr/bin/env python
    2. from __future__ import print_function # Abwärtskompatiblität zu python2
    3. import fileinput
    4. for n, line in enumerate(fileinput.input(), start=1):
    5. line = line.rstrip()
    6. for m, value in enumerate(line.split(';'), start=1):
    7. print("ZEILE_%d_%d='%s'" % (n, m, value))


    Das liefert dann sowas mit deinen Beispieldaten:

    Und in einem Bash-Skript könnte man das so einbinden, um die Variablendefinitionen aus der Ausgabe des Python-Skript zu übernehmen:

    Code
    1. source <(python data2bash.py data.txt)

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi !


    eigentlich ja.. weil ich nicht weiss was die Zukunft bringt... :)
    Muss erst mal schauen ob auf der kiste python laeuft...


    Gruss gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Mit der Bash könnte man es so machen:

    Shell-Script
    1. #!/bin/bash
    2. readarray lines < "$1"
    3. for line_no in "${!lines[@]}"; do
    4. IFS=';' read -ra values <<<"${lines[$line_no]}"
    5. ((line_no ++))
    6. for element_index in "${!values[@]}"; do
    7. number=$((element_index + 1))
    8. echo "ZEILE${line_no}_${number}='${values[$element_index]}'"
    9. done
    10. done

    Das hat den Nachteil, dass ein leeres Feld hinter einem Strichpunkt nicht mit erfasst wird (was aber nur eine Rolle spielt, wenn man im weiteren Verlauf prüfen muss, ob die Variable undefiniert oder definiert aber leer ist):

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    The post was edited 1 time, last by seahawk1986 ().

  • Mist

    Code
    1. ./test.sh: line 181: readarray: command not found


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Was für eine bash-Version hast du denn? Laut http://www.gnu.org/software/ba…l_node/Bash-Builtins.html kannst du mapfile synonym verwenden.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • hi !


    Code
    1. 3.2.51(1)-release


    System ist eine SLES 10.3


    Ich muss mal schaun.. der array muss ja nur die Anzahl der Zeilen beinhalten oder ?



    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Hi !


    Nachdem die bash weder beim readcommand -ra versteht noch es das builtin mapfile gibt hab ich es nun so geloest
    ich lese die Zeile wie gehab in eine Variable und mache dann

    Code
    1. IFS=';' ; arrIN=($VAR); unset IFS;


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Hi !


    So ich bin fast durch damit.... aber ein kleines "Problemchen" hab ich noch:
    Ich muss quasi mit 10 verschiedenen Arrays 10 mal das selbe machen, halt nur mit unterschiedlichen Dingen...
    die "Ur"Funktion (bei dem echo $x mache ich dann mit anderen Kommandos weiter ide aber hier keine Rolle spielen...) und welche auch so wie sie ist funktioniert

    Code
    1. dtc_idtc () {
    2. for i in ${NVHDTC_TXT[*]}; do
    3. x=$(echo $DTC_MASTER | sed s/'dtc'/"$i"/)
    4. echo $x
    5. done
    6. }


    Mein Problem ist
    NVHDTC_TXT DTC_MASTER und dtc möchte ich als parmeter der Funktion übergeben also qausi aufdrufen
    "dtc_idec NVHDTC_TXT DTC_MASTER dtc (welche dann in der Funktion als $1 $2 und $3 zur Verfügung stehen...
    aber ich scheitere schon beim ersten dden Text NVHDTC_TXT von "aussen zuzuführen (ich hab schon mit allen Klammern usw probiert, komme aber nicht wirklich weiter...


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Ich würde da ja lieber eine Sprache wählen, die einem keine Steine in den Weg legt, wenn man Arrays durch die Gegend schieben will... - aber man könnte z.B. so zwei einzelne Werte und einen Array an eine Funktion weitergeben:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi !


    Ich weiss, aber wie schon erwähnt ich kriege das Image vorgegeben und weiss nicht was die Zukunft bringt sprich ob im nächsten nicht was fehlt (z.B. python) und die bash ist aber immer dabei :)
    zu deinem Vorschlag....
    my_array ist schon gemacht :) bzw. die arrays element sind ja schon mit Werten belegt
    und die arrays koennen unterschiedlich heissen
    z.B.
    myarray
    anotherarray
    lastarray


    in meinem Beispiel kann dann NVHDTC_TXT verschieden heissen sprich ich habe 10 verschiedene Arrays...


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • in meinem Beispiel kann dann NVHDTC_TXT verschieden heissen sprich ich habe 10 verschiedene Arrays...

    Deswegen deklariere ich den Array in der Funktion ja als local - wie der heißt ist egal, er wird mit den Elementen befüllt, die noch übrig sind, nachdem die ersten beiden Argumente den (ebenfalls lokal definierten) Variablen zugewiesen wurden.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi !


    Wir reden aneinander vorbei :)


    um den Array zu definieren muss ich aber auch wieder ne Variable von ausserhalb holen :)
    NVHDTC_TXT=($NVHDTC_ALL)
    und in diesem Fall ist NVHDTC_ALL eine Zeile aus meinem Textfile


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Hallo !


    Um es nochmal zu verdeutlichen


    Code
    1. A_TXT=($A_ALL)
    2. .
    3. .
    4. .
    5. H_TXT=($H_ALL)


    Ich hab diese 8 Arrays (A_TXT bis H_TXT) welche schon mit Daten belegt sind. (die Namen sind Kunterbunt also nicht zwingen so analog wie ich sie geschrieben habe....).


    Wenn ich dein script richtig verstehe dann muss ich jedesmal bevor ich das script aufrufe mit diesen einen Array neu erstellen....
    also muss ich den Befehl zum erstellen des Arrays jedesmal an die Funktion "ranklatschen" ? Oder liege ich da falsch?


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • OK ich habs mal probiert.... es scheint zu gehen (nur jetzt klaut er mir wieder die vorangestellten Leerzeichen aus einer Variablen... :)


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice