我需要根据某些列拆分一个包含~500万行的文件,即我需要在不同的块上保留一些列。我知道用于逐行拆分的拆分命令,但不知道是否有任何类似的功能可以像我想要的那样按列拆分。我的文件有 196 ANN
列
SNPID CHR POS Z F N LNBF ANN1 ANN2 ANN3
rs367896724 1 10177 0 0 0 -3.36827717630604 0 0 0
rs555500075 1 10352 0 0 0 -2.30999509213213 0 1 0
rs575272151 1 11008 0 0 0 -1.14611711529388 0 0 1
rs544419019 1 11012 0 0 0 -1.14611711529388 1 1 1
所需的输出将是
#chunk1
SNPID CHR POS Z F N LNBF ANN1
rs367896724 1 10177 0 0 0 -3.36827717630604 0
rs555500075 1 10352 0 0 0 -2.30999509213213 0
rs575272151 1 11008 0 0 0 -1.14611711529388 0
rs544419019 1 11012 0 0 0 -1.14611711529388 1
#chunk2
SNPID CHR POS Z F N LNBF ANN2
rs367896724 1 10177 0 0 0 -3.36827717630604 0
rs555500075 1 10352 0 0 0 -2.30999509213213 1
rs575272151 1 11008 0 0 0 -1.14611711529388 0
rs544419019 1 11012 0 0 0 -1.14611711529388 1
#chunk3
SNPID CHR POS Z F N LNBF ANN3
rs367896724 1 10177 0 0 0 -3.36827717630604 0
rs555500075 1 10352 0 0 0 -2.30999509213213 0
rs575272151 1 11008 0 0 0 -1.14611711529388 1
rs544419019 1 11012 0 0 0 -1.14611711529388 1
我的ANN
列的名称不像ANN1
ANN2
,名称彼此完全不同,我只是为了简单起见使用了ANN
。
速度将是一个问题,因为文件非常大
更新:如果可能的话,我想每 10 或 20 个 ANN 列拆分文件(ANN 的总数为 196)
这样的事情可能会起作用:
% cat script.awk
{
for (i=8;i<=NF;i++) {
print $1, $2, $3, $4, $5, $6, $7, $i >> "chunk"(i-7)".txt"
}
}
这会将每ANN
列的 8 列写入 chunk1.txt
、 chunk2.txt
、... chunkN.txt
(前 7 列,然后是一列ANN
列)。运行它:
awk -f script.awk input_file
我假设>>
将打开一个文件句柄,附加该行,然后关闭它。因此,可以适当地优化它。
使用 perl 的解决方案:
初始文件,包含几列
$ cat file
SNPID CHR POS Z F N LNBF ANN1 ANN2 ANN3 ANN4 ANN5 ANN6 ANN7 ANN8
rs367896724 1 10177 0 0 0 -3.36827717630604 0 0 0 a b c d e
rs555500075 1 10352 0 0 0 -2.30999509213213 0 1 0 f g h i j
rs575272151 1 11008 0 0 0 -1.14611711529388 0 0 1 k l m n o
rs544419019 1 11012 0 0 0 -1.14611711529388 1 1 1 p q r s t
一个 perl 脚本来拆分它
$ perl -alne '
$n=4; # how many data columns to put into the "split" files
for ( ($i,$j)=(7,1); $i < @F; $i+=$n,$j++ ) {
open($fh{$j}, ">", "file.$j") unless $fh{$j};
@data = (@F[0..6], @F[$i .. $i+$n-1]);
print {$fh{$j}} "@data";
}
' file
结果
$ cat file.1
SNPID CHR POS Z F N LNBF ANN1 ANN2 ANN3 ANN4
rs367896724 1 10177 0 0 0 -3.36827717630604 0 0 0 a
rs555500075 1 10352 0 0 0 -2.30999509213213 0 1 0 f
rs575272151 1 11008 0 0 0 -1.14611711529388 0 0 1 k
rs544419019 1 11012 0 0 0 -1.14611711529388 1 1 1 p
$ cat file.2
SNPID CHR POS Z F N LNBF ANN5 ANN6 ANN7 ANN8
rs367896724 1 10177 0 0 0 -3.36827717630604 b c d e
rs555500075 1 10352 0 0 0 -2.30999509213213 g h i j
rs575272151 1 11008 0 0 0 -1.14611711529388 l m n o
rs544419019 1 11012 0 0 0 -1.14611711529388 q r s t