Como extrair dados de forma mais eficiente em um array?

Como extrair dados de forma mais eficiente em um array?

Eu tenho um diretório com alguns arquivos de texto que possuem dados como abaixo; Eu os li através de um loop e coloquei cada linha em um array! Não sei a maneira correta e se você souber de alguma maneira melhor, me avise.

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

Os elementos de cada linha são separados por uma guia, como nome do torrent, tempo adicionado, tamanho (com extensão MB/GB), sementes e sanguessuga.

Por exemplo, para os dados de amostra da primeira linha, os Elementos mencionados seriam:

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

observação: os números de tamanho são variantes (algumas vezes MB - algumas vezes GB), porém, preciso tê-los todos como MB, como devo fazer isso?

Então li cada linha do array com um loop e retirei cada parte que precisava para as próximas etapas!

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

depois de ler cada variável, quero adicioná-la a um array para cada elemento que mencionei anteriormente, quero dizer algo como:

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

Quero preencher esses arrays em um loop, mas não sei como capturar os dados corretamente e qual ferramenta devo usar para capturar com mais eficiência!

Além disso, está tudo em um script, e não tenho permissão para criar nenhum outro arquivo, exceto arquivos de script e até mesmo alterar os arquivos de origem!

Responder1

Sinto muito, não entendi o resto da sua pergunta, mas veja como começar a separar os campos que você realmente deseja da sua entrada:

$ 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

Substituindo guias por vírgulas na entrada/saída para visibilidade:

$ 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

e canalize a saída do script awk para um loop de shell para que você chame awk uma vez no início, em vez de chamar awk várias vezes para cada linha de entrada:

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

Estou assumindo que um loop de shell é apropriado para tudo o que você está tentando fazer, mas não sei.

informação relacionada