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.