【发布时间】:2020-09-12 17:57:32
【问题描述】:
我有许多 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
###### 定义块之间的行数是可变的。
我有一个 ZINC 实体 + 目标档案的标识符列表:
test365/ ZINC000077407198
test227/ ZINC000009100000
test365/ ZINC000077407100
...
目前我这样做:
zcat test365.gz | sed -n '/########## Name: ZINC000077407100/,/########## Name:/p' > ZINC000077407100.out
我得到:
########## 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
效果很好。如果 ZINC000077407100 有 N 个块,我会在 zcat 上提取 N 个块,并且不介意以 ##### 开头的行。
问题是我需要为 N 个标识符 / ZINC_NUMBER 读取存档 N 次我想要的信息。而且要花很多时间,因为我要提取数千个。
所以我想找到一种方法来传递一个数组或标识符列表/ZINC_NUMBER,以根据数组/列表中的标识符将 zcat 读取输出到几个不同的文件。
换句话说,我想使用 zcat 进行单次读取,并为一组标识符提取数据,而不仅仅是一个。
感谢您的帮助!
【问题讨论】:
-
你的问题很难理解。我看到
test365.gz是一个 GB+ 文件。您是否要在该文件中查找数百个文本块并将每个文本块输出到不同的文件?或者您想在数百个其他文件中搜索每个大至test365.gz的数百个文本块?或者是别的什么?顺便说一句,恕我直言,用sed搜索很少是解决方案,我怀疑awk可能会更好。 -
您确定此处发布的
sed命令对您有用吗?首先,我期待-n选项,因为您说您无法解压缩整个文件。然后 sed 命令有 fors/a/,/b/p这对我来说会引发错误。你的意思是sed -n '/a/,/b/p'? -
您是否尝试将大文件拆分为多个以 ID 为关键字的小文件(例如 ZINC000077407100.out)。您需要每个 ID 的文件,还是一个小子集(将检索多少个 ID,与文件中有多少个 ID)?
-
此外,“sed”命令将复制文件的所有内容,包括不包含该模式的行。这将比原来占用更多的空间。
-
最后评论:请澄清行尾在哪里(输入似乎环绕)。