亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有 ID 數組的單個 zcat 多個提取

帶有 ID 數組的單個 zcat 多個提取

慕斯709654 2022-12-06 14:59:33
我有很多 GB+ 大小的 gz 檔案,由于磁盤空間原因我無法解壓。每個存檔都有一個特定的標識號(例如 test365.gz)和如下結構:         1    1    2 1##########                 Name:     ZINC000077407198@<TRIPOS>MOLECULE ZINC000077407198      none@<TRIPOS>ATOM      1 C1          5.7064    -2.3998   -12.0246 C.3        1  LIG1  -0.1500@<TRIPOS>BOND     1    1    2 1##########                 Name:     ZINC000099999999@<TRIPOS>MOLECULE ZINC000099999999      none@<TRIPOS>ATOM      1 C1         -2.0084    -5.2055   -12.9609 C.3        1  LIG1  -0.1500@<TRIPOS>BOND     1    1    2 1##########                 Name:     ZINC000077402345@<TRIPOS>MOLECULE ZINC000077402345     none@<TRIPOS>ATOM      1 C1          6.5657    -1.5531   -15.3414 C.3        1  LIG1  -0.1500@<TRIPOS>BOND     1    1    2 1##########                 Name:     ZINC000077407198@<TRIPOS>MOLECULE ZINC000077407198      none@<TRIPOS>ATOM      1 C1          3.6696    -1.8305   -14.6766 C.3        1  LIG1  -0.1500@<TRIPOS>BOND     1    1    2 1##########                 Name:     ZINC000012345678@<TRIPOS>MOLECULE ZINC000012345678      none@<TRIPOS>ATOM      1 C1          4.5368    -0.8182   -17.4314 C.3        1  LIG1  -0.1500@<TRIPOS>BOND     1    1    2 1##########                 Name:     ZINC000077407100@<TRIPOS>MOLECULE ZINC000077407100      none@<TRIPOS>ATOM      1 C1          1.4756    -2.2562   -14.0852 C.3        1  LIG1  -0.1500@<TRIPOS>BOND     1    1    2 1##########                 Name:     ZINC000077407198@<TRIPOS>MOLECULE ZINC000077407198      none@<TRIPOS>ATOM      1 C1          6.1712    -0.8991   -16.4096 C.3        1  LIG1  -0.1500@<TRIPOS>BOND     1    1    2 1##########                 Name:     ZINC000077407198@<TRIPOS>MOLECULE ZINC000077407198      none@<TRIPOS>ATOM哪個工作正常。如果 ZINC000077407100 有 N 個塊,我會在 zcat 上提取 N 個塊,并且不介意以 ##### 開頭的行。問題是我需要為我想要的信息的 N 個標識符/ZINC_NUMBER 讀取存檔 N 次。這需要很多時間,因為我有數千個要提取。所以我想找到一種方法來傳遞一個數組或標識符列表/ZINC_NUMBER,以根據數組/列表中的標識符將 zcat 讀數輸出到幾個不同的文件。換句話說,我想使用 zcat 進行單次讀取并提取一組標識符的數據,而不僅僅是一個。
查看完整描述

2 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

每個 OP 的要求是處理大量數據(數百萬行,數 GB 數據,以及需要檢索大約 100 個項目的數據)。從技術上講,可以使用現代 bash,但這不太可能表現良好。一個更好的腳本引擎會在這里做得更好。


此處介紹了可能的 bash/awk 解決方案。它將掃描每個引用的文件一次,并一次性提取所有選定的標簽。請注意,“標簽”列表將被掃描多次,但暗示它的大小是合理的


#! /bin/bash -uex

TAGS=data.txt


file_list=$(awk '{ print $1 }' < $TAGS | sort -u)


for f in $file_list ;

do

        gz_name=${f%/}.gz

        zcat $gz_name | awk -v F=$f '

        # Remember tags to retrieve

!DATA && $1 == F { tags[$2] = 1 }

        # OUT set to current output file, empty if item not selected

DATA && $1 == "##########" && $2 == "Name:" {

        OUT = tags[$3] ? $3 ".out" : "" ;

}

OUT { print >OUT }

' $TAGS DATA=1 -

done

不用說,可以使用 Python、Perl、Javascript 或您最喜歡的文本處理工具編寫上述 5 行 awk 作業。使用示例數據集進行測試。


查看完整回答
反對 回復 2022-12-06
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

似乎每個以 開頭的條目##########總是有 6 行。在這種情況下,使用grep -A7而不是使用sed -n /##.../,/##.../p. 我想您只打印了后續標題,因為這樣更容易(至少在使用時sed)。因此,我排除了此答案中的后續標頭(grep -A6而不是grep -A7)。


grep可以給出要搜索的模式列表。這是通過-f選項完成的。模式列表可以從您的文件中生成。首先按存檔名稱(例如test365)分組,然后打印該存檔的所有模式。在這里我們習慣awk這樣做??兆止澐指裘總€存檔的模式部分。


為了防止誤報(并可能加快搜索速度),我們只搜索完整的行而不是子字符串。為了加快速度,我們設置了LC_ALL=C. 您可能還會發現它zgrep比zcat | grep.


以下腳本最多解壓縮每個存檔一次。


awk -v prefix='##########                 Name:     ' '

  {a[$1]=a[$1] "\n" prefix $2}

  END {for (k in a) print k a[k] "\0"}

' /path/to/your/list.txt |

while IFS=$'\n' read -r -d '' archive patterns; do

  LC_ALL=C zgrep -A6 -Fxf <(printf %s "$patterns") "${archive/\//.gz}"

  # TODO do something with the output for this archive

done

在上面的腳本中,我test365/從您的列表test365.gz自動轉換為。我不知道你的目錄結構。如果您需要不同的東西,請修改zgrep. $archive遍歷您的(分組)列表的第一列(即,每個存檔僅列出一次)。


從您的示例代碼來看,您似乎想要為每個模式生成一個單獨的文件。為此,將循環體從上方替換為


zgrep ... > /tmp/zincfound

while IFS= read -r pattern; do

    grep -A6 -Fx "$pattern" /tmp/zincfound > "${pattern##* }.out" 

done <<< "$patterns"

rm /tmp/zincfound


查看完整回答
反對 回復 2022-12-06
  • 2 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號