拆分文件,保留一些列



我需要根据某些列拆分一个包含~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.txtchunk2.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

相关内容

  • 没有找到相关文章

最新更新