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

时间:2019-06-25 16:18:26

标签: macos unix terminal tail gz

我有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终端如何实现?

3 个答案:

答案 0 :(得分:4)

您需要先解压缩才能删除前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

答案 1 :(得分:2)

使用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

答案 2 :(得分:0)

从您的问题中我了解到:

  1. 您的 MACOS 目录中有600个具有 neutral _ *。msOut.gz 模式的gzip压缩文本文件。
  2. 您要生成一个未压缩的文本文件: neutral.msOut ,其中合并了上面所有600个文件的文本行,但每个文本文件的前15行除外。 / li>

如果以上情况成立,请在Mac的终端中执行以下三个步骤:

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

尾部使用的选项说明:

  1. -q-防止每个文件片段前面都带有文件信息
  2. -n '+16'-选择从第16行文本开始的尾部