拆分文件保留一些列

时间:2016-06-03 20:13:32

标签: bash awk

我需要根据某些列拆分大约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)

2 个答案:

答案 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.txtchunk2.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
相关问题