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

Unix 如何使用awk或sed复制列并基于分隔符拆分另一列?,unix,awk,sed,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:1058

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

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脚本来实现这一点,但是它占用了太多的内存。
QUAL
FILTER
列只是虚拟列,其中所有行都是
。如何使用awk或sed之类的工具获得所需的输出?

通过在冒号上拆分$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
这可能适用于您(GNU-sed):


模式匹配和反向引用。

减去1对于处理文件的方式,请使用Ed编写的内容。编辑你的帖子并给你+1。
sed -E 's/^((.*):(.*):(.*):(.*)) /\2 \3 \1\4 \5. . /' file