如何使用awk或sed复制基于分隔符的列并拆分另一列?

时间:2019-07-01 21:17:00

标签: unix awk sed

我有一个很大的输入文件,如下所示:

VARIANTS        SAMPLES
chr1:10583:G:A  HSB100
chr1:10583:G:A  HSB105
chr1:10583:G:A  HSB107
chr1:10583:G:A  HSB121
chr1:10583:G:A  HSB122

我需要它看起来像是:

CHROM   POS     ID              REF ALT QUAL FILTER INFO
chr1    10583   chr1:10583:G:A  G   A   .    .      HSB100
chr1    10583   chr1:10583:G:A  G   A   .    .      HSB105
chr1    10583   chr1:10583:G:A  G   A   .    .      HSB107
chr1    10583   chr1:10583:G:A  G   A   .    .      HSB121
chr1    10583   chr1:10583:G:A  G   A   .    .      HSB122

基本上,我需要复制输入的第一列(它将成为ID列),然后基于':'分隔符将原始列拆分为那些新列。我已经写了一个python脚本来做到这一点,但是它占用了太多的内存。 QUALFILTER列只是虚拟列,其中所有行均为.。我该如何使用awk或sed这样的输出?

2 个答案:

答案 0 :(得分:2)

通过在$ 1中分割冒号,可以使用以下命令生成输出:

$ awk '{split($1,s,":"); print s[1],s[2],$1,s[3],s[4],".",".",$2;}' file.txt
chr1 10583 chr1:10583:G:A G A . . HSB100
chr1 10583 chr1:10583:G:A G A . . HSB105
chr1 10583 chr1:10583:G:A G A . . HSB107
chr1 10583 chr1:10583:G:A G A . . HSB121
chr1 10583 chr1:10583:G:A G A . . HSB122

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -E 's/^((.*):(.*):(.*):(.*)) /\2 \3 \1\4 \5. . /' file

模式匹配和反向引用。