【问题标题】:Combining large number of files in one file using terminal使用终端将大量文件合并到一个文件中
【发布时间】:2019-06-25 16:18:26
【问题描述】:

我有 600 个文件要合并/合并为一个。我已经在 Mac 终端上使用以下命令完成了这项工作:

  cat neutral_*.msOut.gz > neutral.msOut

每个文件的格式如下:

 // Initial random seed:
 1824618124544

 // RunInitializeCallbacks():
 initializeMutationRate(0);
 initializeMutationType(1, 0.5, "f", 0);
 initializeGenomicElementType(1, m1, 1);
 initializeGenomicElement(g1, 0, 1099999);
 initializeRecombinationRate(1e-08);

 // Starting run at generation <start>:
 1 

 #WARNING (Subpopulation::ExecuteMethod_outputXSample): outputMSSample() should probably not be called from an early() event in a WF model; the output will reflect state at the beginning of the generation, not the end.
 #OUT: 1 SM p3 208

 //
 segs: 3
 positions: 0.0012,0.19383,0.18383
 001
 110
 111

合并这些文件时,我只想在最终合并文件中包含前 15 行(每个文件中相同)一次。使用 Mac 终端如何实现?

【问题讨论】:

  • 为什么看似解压的文本文件的名称类似于*.gz?您是否显示文件的解压缩内容?
  • 是的,这是正确的
  • 注意:我相信我的回答正是您所需要的。如果这是真的,请标记为答案和/或投票,否则请解释您到底需要什么。
  • 恕我直言,您在问题中引用的命令:cat neutral_*.msOut.gz &gt; neutral.msOut 生成合并的 二进制压缩 输出文件:neutral.msOut - 应该是可能称为:neutral.msOut.gz。如果你打算生成一个文本文件,它仍然需要解压缩。因此,您需要执行的命令只需将这些压缩文件的所有文本内容加入单个文本文件(不排除前 15 行,如我的回答)需要:cat neutral_*.msOut.gz &gt; neutral.msOut.gz 和: gunzip neutral.msOut.gz.

标签: macos unix terminal tail gzip


【解决方案1】:

您需要先解压缩才能删除前 15 行

for i in neutral_*.msOut.gz
do
  zcat $i | head -15 $i > neutral.msOut
  break
done

for i in neutral_*.msOut.gz
do
  zcat $i | sed -e 1,15d >> neutral.msOut
done
  • 第一个循环只提取一个文件中的前 15 行一次,以使它们在结果文件中一次,知道其中一个文件的名称可以简化循环,只提取它的前 15 行。如果您不想在生成的文件中包含该标头,只需删除该循环
  • 第二个循环添加除了每个文件的前 15 行之外的所有内容
  • 不需要有给定版本的 tail(请参阅@kabanus 的已删除答案中的备注tail does not have a -q option on osx
  • 可能你需要在两个循环之后压缩neutral.msOut

【讨论】:

  • 仅供参考@Bruno:Simon Sheppard 今天更新了:[ss64.com/osx/tail.html],因为我昨天向他提到了它。不过,由于 Simon 忙于更新网站的 macOS 版本,其余的 macOS 页面可能暂时不会更新。因此,与此同时,只需尝试使用 Terminal man 命令来获取每个支持的命令的实际信息。
【解决方案2】:

使用 sed:

sed -e '1,15d' neutral_*.msOut.gz > neutral.msOut

但是从您的 cmets 看来,您似乎也想解压缩文件。如果是这样:

for i in neutral_*.msOut.gz; do gzip -dc "$i" | sed -e 1,15d; done > neutral.msOut

【讨论】:

  • 但它只排除了它读取的第一个文件的前 15 行。不是其余的文件。
  • 不,这不包括每个文件的前 15 行。也许您的评论是为了布鲁诺的回答。
  • 啊...除非您在每个 .gz 文件中压缩了多个文件,并且您正在尝试处理所有这些文件。在这种情况下,您必须将每个 gzip 解压缩到文件系统中。此外,您需要修改您的问题以提供您正在尝试执行的操作的实际详细信息。
  • 也许@Peter 想象 sed 是在 之后完成的 for 类似于(for i in neutral_*.msOut.gz; do gzip -dc "$i"; done) | sed -e 1,15d 但这不是在这里和我的回答中的情况,即使使用了几行,这在我的情况下也更明显;-)
【解决方案3】:

根据您的问题,我了解到:

  1. 您的 MACOS 目录中有 600 个具有 neutral_*.msOut.gz 模式的 gzip 压缩文本文件。
  2. 您想要生成一个未压缩的文本文件:neutral.msOut,它结合了上述所有 600 个文件的文本行,不包括每个文本文件的前 15 行。

如果上述情况属实,请在 Mac 的终端中执行以下 3 个步骤:

  1. CD 到您保存 600 个中性_*.msOut.gz 文件的目录。
  2. 执行:gunzip neutral_*.msOut.gz#解压600个文件。
  3. 执行:tail -q -n '+16' neutral_*.msOut &gt; neutral.msOut# 创建结果文本文件。

tail 中使用的选项说明:

  1. -q - 防止在每个文件片段之前添加文件信息
  2. -n '+16' - 选择从文本第 16 行开始的尾部

【讨论】:

  • 亲爱的@bruno,我已经删除了关于前 15 行的评论,因为 OP 认为您的解决方案是正确的,我同意。但是:我的解决方案虽然效率可能较低(我没有测试过),但它完全符合它的要求 - 合并行:每个原始压缩文件的 16-EOF 到单个文本文件。此外,您未经证实的tail -q 故事就是……一个高大的故事:) 只需在 macOS 终端应用程序中输入man tail,即可查看:SYNOPSIS tail [-F | -f | -r] [-q] [-b number | -c number | -n number] [file ...] 和:-q Suppresses printing of headers when multiple files are being examined. :)
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 2014-10-15
  • 2020-09-26
  • 2013-08-28
相关资源
最近更新 更多