我需要根据某些列拆分大约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)
答案 0 :(得分:5)
这样的事可能有用:
% 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
我假设>>
将打开一个文件句柄,追加该行然后关闭它。因此,优化它是正确的。
答案 1 :(得分:3)
使用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