读取 txt 文件,其中每 n 行开始一个新行,由特殊字符分隔

Reading txt file in which a new row starts every n line, delimited by special character

我正在阅读一个文件,其中包含大约 10 分钟的氨基酸序列数据。 600000 种蛋白质。 for whomever this might be of interest, here the source

由于文件大小和方便起见,我使用 data.table::fread。 “问题”是该文件仅每第二行包含一个新条目,并以“>”开头。这不是什么大问题,因为我可以做一些小的争论,我想要什么就拥有它。 (查看所需输出,甚至“理想输出”)。

我想知道是否有一种直接读取具有这种结构的文件的方法。当然也欢迎任何其他包装,但它应该能很好地处理这种尺寸。

library(tidyverse)

# "text = ..." contains a shortened version of the first two entries of the downloaded txt file
prot <- data.table::fread(text = 
">101m_A mol:protein length:154  MYOGLOBIN
QGAMNKALEL
>102l_A mol:protein length:165  T4 LYSOZYME
RAKRVITTFR", 
header = FALSE
)

prot <- as.data.frame(prot)

# expected output
exp_out <- bind_cols(prot = prot[c(T, F), ], aminoseq = prot[c(F, T), ] )
exp_out
#> # A tibble: 2 x 2
#>   prot                                        aminoseq  
#>   <chr>                                       <chr>     
#> 1 >101m_A mol:protein length:154  MYOGLOBIN   QGAMNKALEL
#> 2 >102l_A mol:protein length:165  T4 LYSOZYME RAKRVITTFR

# ideal output
exp_out %>%
  separate(prot, c("mol", "length"), sep = ":protein length:") %>%
  separate(length, c("length", "name"), sep = "\s{2}+")
#> # A tibble: 2 x 4
#>   mol         length name        aminoseq  
#>   <chr>       <chr>  <chr>       <chr>     
#> 1 >101m_A mol 154    MYOGLOBIN   QGAMNKALEL
#> 2 >102l_A mol 165    T4 LYSOZYME RAKRVITTFR

reprex package (v0.3.0)

创建于 2021-01-07

分别读取奇数行和偶数行,using sed,然后 fread 与列绑定,这将使您获得“预期输出”,它也非常快, 解压缩输入大约 2 秒:

# get the data
# wget ftp://ftp.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt.gz
library(data.table)

# unzip on the fly
started.at = proc.time()
d <- cbind(
  fread(cmd = "zcat pdb_seqres.txt.gz | sed -n 'p;n'", sep = "|"),
  fread(cmd = "zcat pdb_seqres.txt.gz | sed -n 'n;p'"))
cat("Finished in", timetaken(started.at), "\n")
# Finished in 4.585s elapsed (1.788s cpu)

# read unzipped input
started.at = proc.time()
d <- cbind(
  fread(cmd = "sed -n 'p;n' pdb_seqres.txt", sep = "|"),
  fread(cmd = "sed -n 'n;p' pdb_seqres.txt"))
cat("Finished in", timetaken(started.at), "\n")
# Finished in 1.796s elapsed (1.111s cpu)

理论上下面应该可行,即我们在 freading 之前使用 bash paste 进行列绑定,但它一直提供我关于临时文件权限的错误,可能适用于您的设置。

fread(cmd = "paste -d'|' <(sed -n 'p;n' pdb_seqres.txt) <(sed -n 'n;p' pdb_seqres.txt)",
      sep = "|")