Как эффективнее извлекать данные из массива?

Как эффективнее извлекать данные из массива?

У меня есть каталог с некоторыми текстовыми файлами, которые содержат данные, как показано ниже; я читаю их через цикл и помещаю каждую строку в массив! Я не знаю правильного способа, и если вы знаете лучший способ, дайте мне знать.

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

Элементы каждой строки разделены табуляцией, например, имя торрента, добавленное время, размер (с расширением МБ/ГБ), сиды и лич.

Например, для данных выборки первой строки указанные элементы будут следующими:

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

Примечание: размеры могут варьироваться (иногда МБ, иногда ГБ). Мне нужно, чтобы все они были в МБ. Как это сделать?

Поэтому я считываю каждую строку массива с помощью цикла и извлекаю каждую часть, которая мне нужна для следующих шагов!

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

после считывания каждой переменной я хочу добавить ее в массив для каждого элемента, о котором я упоминал ранее, я имею в виду что-то вроде:

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

Я хочу заполнить эти массивы в цикле, но не знаю, как правильно извлечь данные и какой инструмент мне следует использовать для более эффективного извлечения!

Кроме того, все это находится в скрипте, и мне не разрешено создавать какие-либо дополнительные файлы, кроме файлов скрипта, и даже изменять исходные файлы!

решение1

Извините, я не понимаю остальную часть вашего вопроса, но вот как начать отделять поля, которые вам действительно нужны, от входных данных:

$ 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

Замена табуляции на запятые во входных/выходных данных для наглядности:

$ 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

и направить вывод скрипта awk в цикл оболочки, чтобы вызвать awk один раз в начале, а не вызывать awk несколько раз для каждой входной строки:

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

Я предполагаю, что цикл оболочки подойдет для того, что вы пытаетесь сделать, но не знаю.

Связанный контент