使用终端将大量文件合并到一个文件中
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
根据你的问题我了解到:
- 您的 MACOS 目录中有 600 个 gzip 压缩文本文件,格式为 neutral_*.msOut.gz。
- 您想生成一个未压缩的文本文件:neutral.msOut,它结合了上述所有 600 个文件的文本行,不包括前 15 行这些文本文件中的每一个。
如果上述情况属实,请在 Mac 的终端中执行以下 3 个步骤:
- CD 到您保存 600 个 neutral_*.msOut.gz 文件的目录。
- 执行:
gunzip neutral_*.msOut.gz
#解压600个文件。
- 执行:
tail -q -n '+16' neutral_*.msOut > neutral.msOut
# 创建结果文本文件。
tail中使用的选项说明:
-q
- 防止在每个文件片段前添加文件信息
-n '+16'
- select 从文本行号 16 开始的尾部
我有 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
根据你的问题我了解到:
- 您的 MACOS 目录中有 600 个 gzip 压缩文本文件,格式为 neutral_*.msOut.gz。
- 您想生成一个未压缩的文本文件:neutral.msOut,它结合了上述所有 600 个文件的文本行,不包括前 15 行这些文本文件中的每一个。
如果上述情况属实,请在 Mac 的终端中执行以下 3 个步骤:
- CD 到您保存 600 个 neutral_*.msOut.gz 文件的目录。
- 执行:
gunzip neutral_*.msOut.gz
#解压600个文件。 - 执行:
tail -q -n '+16' neutral_*.msOut > neutral.msOut
# 创建结果文本文件。
tail中使用的选项说明:
-q
- 防止在每个文件片段前添加文件信息-n '+16'
- select 从文本行号 16 开始的尾部