使用bash cut或awk根据列将一个文件拆分为多个文件

时间:2018-03-27 19:09:22

标签: bash

我有一个用tab分隔的2TB文本表文件,还有一列用“;”分隔。是的,它实际上是一个非常大的vcf文件。

使用制表符分隔符,我们有8列,并使用“;”分隔符,我们可以将第8列拆分成另外12列。

为了便于统计分析,我需要将文件拆分为19个文件,每个文件包含一列。最好我可以只浏览一次文件(因为文件很大,我有100个大文件,IO成本非常高)并且将19列写入19个单独的文件。

我已经以有效的方式实现了这个问题,基本上是

cut 1-2 file.txt> column12.txt

但要获得这19个列,我需要通过该文件19次并且效率不高。

我想知道是否有一种有效的方式来浏览文件并将其写入19个文件?

非常感谢你的帮助。

文件示例如下所示

a b c d e f g;h;i;j;k
m n o p q l x;y;z;o;p
a b c d e f g;h;i;j;k
a b c d e f g;h;i;j;k

然后我想要文件包含

a
m
a
a

1 个答案:

答案 0 :(得分:1)

使用awk:

awk -F '[\t;]' '{for(i=1; i<=NF; i++) print $i >> "column" i ".txt"}' file

使用制表符和分号作为字段分隔符。 NF包含当前行中最后一列的编号。 $i包含当前列的内容和当前列的i个数。

这会创建11个文件。 column11.txt包含:

k
p
k
k