Wie lassen sich Daten in einem Array effizienter extrahieren?

Wie lassen sich Daten in einem Array effizienter extrahieren?

Ich habe ein Verzeichnis mit einigen Textdateien, die Daten wie unten enthalten. Ich lese sie über eine Schleife und füge jede Zeile in ein Array ein! Ich kenne den richtigen Weg nicht und wenn Sie einen besseren kennen, lassen Sie es mich wissen.

Attack On Titan S03E20 720p WEB x264-URANiME[eztv] 6/17/2019 394 MB 114 37
Attack On Titan S003E020 WEB x264-URANiME Yesterday 172 MB 76 3
Attack On Titan S03E18 1080p WEB x264-URANiME 6/5/2019 1 GB 46 3
Attack On Titan S003E017 720p WEB x264-URANiME[eztv] 5/27/2019 555 MB 41 10
Attack On Titan s02E20 WEB x264-URANiME[eztv] 6/17/2019 171 MB 40 7
Attack On Titan S03e18 WEB x264-URANiME 6/3/2019 200 MB 23 3
Attack On Titan S03E16 720p WEB x264-URANiME[eztv] 5/20/2019 522 MB 23 3
Attack On Titan s03e19 WEB x264-URANiME Today 196 MB 20 0
Attack On Titan S03E14 720p WEB x264-URANiME[eztv] 5/6/2019 545 MB 19 2

Elemente jeder Zeile werden durch einen Tabulator getrennt, wie Torrentname, hinzugefügte Zeit, Größe (mit MB/GB-Erweiterung), Seeds und Leech.

Für die Beispieldaten der ersten Zeile wären beispielsweise folgende Elemente erwähnt:

torrent name: Attack On Titan S03E20 720p WEB x264-URANiME[eztv]
season number: 3
episode number: 20
added time: 6/17/2019
size: 394 MB
seed: 114
leech: 37

Hinweis: Die Größenangaben sind unterschiedlich (manchmal MB, manchmal GB). Ich muss sie alle in MB angeben. Wie mache ich das?

Also lese ich jede Zeile des Arrays mit einer Schleife und ziehe jeden Teil heraus, den ich für die nächsten Schritte brauche!

for array_list in "${TORRENT_FILE_ARRAY[@]}"
do
    TORRENT_NAME=`echo "$array_list" | awk '{print $1}' FS="\t"`
    SEASON_NUMBER=`echo "$array_list" | awk '{print $1}' FS="\t" | awk '{print $4}' FS=" " | awk 'BEGIN {IGNORECASE = 1} {print $1}' FS="E" | sed "s/[Ss]//g" | sed 's/^0*//'`
    EPISODE_NUMBER=`echo "$array_list" | awk '{print $1}' FS="\t" | awk '{print $4}' FS=" " | awk 'BEGIN {IGNORECASE = 1} {print $2}' FS="E" | sed "s/[Ee]//g" | sed 's/^0*//' `
    FILE_SIZE=`echo "$array_list" | awk '{print $3}' FS="\t"`
    LEECH_NUMBER=`echo "$array_list" | awk '{print $4}' FS="\t"`
    SEED_NUBMBER=`echo "$array_list" | awk '{print $5}' FS="\t"`
    # echo $TORRENT_NAME
    # echo $FILE_SIZE
    # echo $LEECH_NUMBER
    # echo $SEED_NUBMBER
    # echo "SEASON_NUMBER:" $SEASON_NUMBER 
    # echo "EPISODE_NUMBER:" $EPISODE_NUMBER
done

nachdem ich jede Variable gelesen habe, möchte ich sie einem Array für jedes zuvor erwähnte Element hinzufügen, also so etwas wie:

TORRENT_NAME[$x]=$extracted_TORRENT_NAME
FILE_SIZE[$x]=$extracted_FILE_SIZE
LEECH_NUMBER[$x]=$extracted_LEECH_NUMBER
SEED_NUBMBER[$x]=$extracted_SEED_NUBMBER 
SEASON_NUMBER[$x]=$extracted_SEASON_NUMBER
EPISODE_NUMBER[$x]=$extracted_EPISODE_NUMBER

Ich möchte diese Arrays in einer Schleife füllen, weiß aber nicht, wie ich die Daten richtig erfasse und welches Tool ich zum effizienteren Erfassen verwenden soll.

Außerdem befindet sich alles in einem Skript und ich darf außer Skriptdateien keine weiteren Dateien erstellen und nicht einmal die Quelldateien ändern!

Antwort1

Es tut mir leid, ich verstehe den Rest Ihrer Frage nicht, aber so können Sie beginnen, die wirklich gewünschten Felder von Ihrer Eingabe zu trennen:

$ cat file
Attack On Titan S03E20  720p WEB x264-URANiME[eztv]     6/17/2019       394 MB  114     37

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    name = $1
    sub(/ [^ ]+$/,"",name)
    sub(/.* [Ss]/,"",$1)
    sub(/[Ee]/,OFS,$1)
    $2 = $1
    $1 = name
    print
}

$ awk -f tst.awk file
Attack On Titan 03      20      6/17/2019       394 MB  114     37

Ersetzen von Tabulatoren durch Kommas in der Ein-/Ausgabe zur besseren Sichtbarkeit:

$ tr $'\t' ',' < file
Attack On Titan S03E20,720p WEB x264-URANiME[eztv],6/17/2019,394 MB,114,37

$ awk -f tst.awk file | tr $'\t' ','
Attack On Titan,03,20,6/17/2019,394 MB,114,37

und leiten Sie die Ausgabe des awk-Skripts an eine Shell-Schleife weiter, sodass Sie awk einmal am Anfang aufrufen, anstatt es für jede Eingabezeile mehrmals aufzurufen:

awk -f tst.awk file |
while IFS=$'\t' read -r torrent_name season_name episode_number file_size leech_number seed_number; do
    whatever you need to do with creating directories and files
done

Ich gehe davon aus, dass eine Shell-Schleife für das, was Sie versuchen, geeignet ist, aber ich weiß es nicht.

verwandte Informationen