使用终端将大量文件合并到一个文件中

Combining large number of files in one file using terminal

我有 600 个文件要 combine/merge 合并。我在 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 终端来实现?

使用 sed:

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

但是从您的评论来看,您似乎也想解压文件。如果是:

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

您需要先解压才能删除前 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 行它。如果您不想在生成的文件中包含 header,只需删除该循环
  • 第二个循环添加除每个文件的前 15 行之外的所有内容
  • 不需要给定版本的 tail(请参阅@kabanus 的已删除答案中的备注 tail does not have a -q option on osx
  • 可能您需要在两个循环后压缩 neutral.msOut

根据你的问题我了解到:

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

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

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

tail中使用的选项说明:

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