【问题标题】:concatenate many files into bigger file without the header将许多文件连接成没有标题的更大文件
【发布时间】:2016-10-07 23:51:51
【问题描述】:

我正在尝试在 R 中执行此操作,但 windows 命令行也可以工作。

假设有 10 个大文件,每个文件的第一行都有一个标题。我想要一个包含所有这些文件但没有标题的文件。

我能找到的最快方法是尝试“复制/b”命令将所有这些文件连接成一个更大的文件,然后使用 SED 软件执行命令行查找该大文件中的标题模式并将它们删除.

SED 很慢,我不想在任何需要这种方法的机器上安装 SED。有没有办法使用 copy \b 命令从第二行向前粘贴到那个更大的文件中?

我还完成了通过“fread”从 data.table 包中将文件读入内存的技术,然后使用带有附加功能的 write.table 来制作更大的文件。 (但是 write.table 超级超级慢,并且 data.table 的“fwrite”命令还没有出现在 CRAN 上……它仍在 github 上开发,所以它可能不像我想要的那样稳定是)。

有人有建议吗?

谢谢

【问题讨论】:

  • 这将有助于在 R 中提供可重现的代码。具体来说,您是否希望将标题保留为最终结果的第一行?您的问题更多是关于数据争吵还是关于大文件的读/写性能?
  • 如果所有文件都具有相同的标题,您可以使用MyList <- lapply() 将所有大文件读入R 中的列表,然后使用MyData <- Reduce(function(...) rbind, MyList) 将它们全部放入一个数据帧中。或者通过将lapply() 放在MyData <- 行中一步完成。 (这假设您在 lapply() 步骤中将它们作为数据框读入,标题行作为列名。)
  • 问题只是写入速度。为了将文件读入内存,我处于可能的最大速度,这受到 write.table 速度慢的阻碍。
  • 所有文件都有相同的标题。但 ulfeldor 所说的是如何阅读所有这些内容。这不是问题(无论我是一个一个地读取它们,还是一次读取它们,或者将它们绑定在一起),它们写回一个大文件是瓶颈。所以知道我不是在操作数据并且只想将它们连接在一起,我认为有一种方法可以在不将它们读入内存并使用更多与磁盘相关的复制方法的情况下执行此过程......
  • 你能在 linux 中做到这一点吗?一定要用DOS吗?

标签: r cmd header concatenation


【解决方案1】:

你可以在 R 中尝试这样的事情。下面是一个 Rscript 可以做到这一点。

cmdArgs<-c("peakListFile.txt") # read a list of all files that you want to concatenate
peakList<-cmdArgs[1]
peakFileDF<-read.table(peakList, header=F) # create a df for list file

tempdf<-matrix(,, ncol=10, dimnames=list(c(), c("V1", "V2", "V3", "V4", "V5","V6", "V7", "V8", "V9", "V10"))) # create an empty df

for(i in peakFileDF$V1)
{
tmp<-read.delim(i, sep="\t", header=F, stringsAsFactors=F)
tempdf<-rbind(tmp, tempdf)
}
tempdf<-tempdf[rowSums(is.na(tempdf)) != ncol(tempdf),] # Removing the line with NA coming from creation of empty df above

【讨论】:

  • 这不是我想要的。您的解决方案似乎只是阅读文件列表。再次,我必须指出,这与阅读它们无关(使用 data.table 包很快)。主要是写它们;关于创建一个新文件。我想知道一个可以通过不读入内存并执行连接的直接文件复制方法来加快进程的黑客。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多