Tengo un directorio con algunos archivos de texto que tienen datos como los siguientes; ¡Los leo mediante un bucle y pongo cada línea en una matriz! No sé la forma correcta y si conoces alguna forma mejor, dímelo.
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
Los elementos de cada línea están separados por una pestaña, como nombre del torrent, tiempo agregado, tamaño (con extensión MB/GB), semillas y sanguijuela.
Por ejemplo, para los datos de muestra de la primera línea, los elementos mencionados serían:
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
nota: los números de tamaño son variantes (algunas veces MB, otras veces GB). Sin embargo, necesito tenerlos todos como MB, ¿cómo debo hacerlo?
¡Así que leí cada línea de la matriz con un bucle y saqué cada parte que necesitaba para los siguientes pasos!
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
después de leer cada variable quiero agregarla a una matriz para cada elemento que mencioné anteriormente, me refiero a 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
Quiero completar estas matrices en un bucle, pero no sé cómo capturar los datos correctamente ni qué herramienta debo usar para capturarlos de manera más eficiente.
Además, todo está en un script y no puedo crear ningún archivo adicional, excepto archivos de script e incluso cambiar archivos fuente.
Respuesta1
Lo siento, no entiendo el resto de tu pregunta, pero aquí te explicamos cómo empezar a separar los campos que realmente deseas de tu 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
Reemplazar pestañas con comas en la entrada/salida para mayor visibilidad:
$ 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
y canalice la salida del script awk a un bucle de shell para que pueda llamar a awk una vez al inicio en lugar de llamar a awk varias veces para cada línea 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
Supongo que un bucle de shell es apropiado para lo que sea que estés intentando hacer, pero no lo sé.