Bash

如何在數組中更高效地提取數據?

  • December 1, 2019

我有一個包含一些文本文件的目錄,其中包含如下數據;我通過循環讀取它們並將每一行放入一個數組中!我不知道正確的方法,如果您知道更好的方法,請告訴我。

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

每行的元素由選項卡分隔,如種子名稱、添加時間、大小(帶有 MB/GB 副檔名)、種子和水蛭。

例如,對於第一行樣本數據,提到的元素將是:

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

注意:大小數字是不同的(有時是 MB - 有時是 GB),但我需要將它們全部作為 MB,我應該怎麼做?

所以我用一個循環讀取數組的每一行,然後取出下一步我需要的每個部分!

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

我想在一個循環中填充這些數組,但不知道如何正確抓取數據以及我應該使用什麼工具來更有效地捕捉!

此外,這一切都在一個腳本中,除了腳本文件甚至更改源文件之外,我不允許製作任何其他文件!

對不起,我不明白你的問題的其餘部分,但這裡是如何開始從你的輸入中分離你真正想要的欄位:

$ 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 腳本的輸出通過管道傳輸到 shell 循環,以便在開始時呼叫 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

我假設一個 shell 循環適用於你想要做的任何事情,但 idk。

引用自:https://unix.stackexchange.com/questions/554242