2013-05-14 51 views
1

我有一个文件(test.bed),看起来像这样(这可能不是被制表分隔):如何分割AWK场正确

chr1 10002 10116 id=1;frame=0;strand=+; 0 + 
chr1 10116 10122 id=2;frame=0;strand=+; 0 + 
chr1 10122 10128 id=3;frame=0;strand=+; 0 + 
chr1 10128 10134 id=4;frame=0;strand=+; 0 + 
chr1 10134 10140 id=5;frame=0;strand=+; 0 + 
chr1 10140 10146 id=6;frame=0;strand=+; 0 + 
chr1 10146 10182 id=7;frame=0;strand=+; 0 + 
chr1 10182 10188 id=8;frame=0;strand=+; 0 + 
chr1 10188 10194 id=9;frame=0;strand=+; 0 + 
chr1 10194 10200 id=10;frame=0;strand=+; 0 + 

我想产生下面的输出(这应该是制表分隔):

chr1 10002 10116 id=1 0 + 
chr1 10116 10122 id=2 0 + 
chr1 10122 10128 id=3 0 + 
chr1 10128 10134 id=4 0 + 
chr1 10134 10140 id=5 0 + 
chr1 10140 10146 id=6 0 + 
chr1 10146 10182 id=7 0 + 
chr1 10182 10188 id=8 0 + 
chr1 10188 10194 id=9 0 + 
chr1 10194 10200 id=10 0 + 

我试图用下面的代码:

awk 'OFS="\t" split ($0, a, ";"){print a[1],$5,$6}' test.bed 

但后来我得到:

chr1 10002 10116 id=1 40 4+ 
chr1 10116 10122 id=2 40 4+ 
chr1 10122 10128 id=3 40 4+ 
chr1 10128 10134 id=4 40 4+ 
chr1 10134 10140 id=5 40 4+ 
chr1 10140 10146 id=6 40 4+ 
chr1 10146 10182 id=7 40 4+ 
chr1 10182 10188 id=8 40 4+ 
chr1 10188 10194 id=9 40 4+ 
chr1 10194 10200 id=10 40 4+ 

我在做什么错?不知何故,数字“4”被添加到最后两个字段。我认为数字'4'在某种程度上可能与第4场中的分裂有关,但是,我尝试生成一个类似的文件,它是第3场被分割,仍然有数字'4'被添加到最后两个领域。我对'awk'比较陌生,所以我猜这是语法错误。任何帮助,将不胜感激。

+1

尝试'sed的 'S /;帧= 0;链= +; //'' – kev 2013-05-14 09:21:55

回答

1

如果您设置字段分隔符为空白或半支柱,你不会有处理自己分裂:

$ awk '{print $1,$2,$3,$4,$8,$9}' FS='[[:space:]]+|;' OFS='\t' file 
chr1 10002 10116 id=1 0 + 
chr1 10116 10122 id=2 0 + 
chr1 10122 10128 id=3 0 + 
chr1 10128 10134 id=4 0 + 
chr1 10134 10140 id=5 0 + 
chr1 10140 10146 id=6 0 + 
chr1 10146 10182 id=7 0 + 
chr1 10182 10188 id=8 0 + 
chr1 10188 10194 id=9 0 + 
chr1 10194 10200 id=10 0 + 

至于你在做什么错:

awk 'OFS="\t" split ($0, a, ";"){print a[1],$5,$6}' 
  • awk的语法是condition{block}并将值设置为OFS并将i没有条件。他们是应该在块内的声明。
  • 但是,您确实无需在每行上设置OFS的值,因此它只应初始化一次。您可以使用-v选项在BEGIN块中或在脚本之后执行此操作。

有效的替代品:

$ awk -v OFS='\t' '{split($0,a,";");print a[1],$5,$6}' file 

$ awk 'BEGIN{OFS="\t"}{split($0,a,";");print a[1],$5,$6}' file 

$ awk '{split ($0,a,";");print a[1],$5,$6}' OFS='\t' file 
+0

谢谢你,那不工作。任何想法发生在我的代码产生数字4? – user53416 2013-05-14 09:22:44

+0

它是分割的返回值。你以不正确的格式写了awk参数。你所有的操作应该放在'{..}'里面,我只是像这样'awk'改变你的awk OFS =“\ t”{split($ 0,a,“;”);打印一个[1],$ 5,$ 6 }''注意''在'split'之前移动,并且它正常工作 – abasu 2013-05-14 09:31:23

+0

谢谢你的解释,这非常有帮助。然而,我想这不是完全的方式,因为这只是制表符分隔最后的字段。 – user53416 2013-05-14 09:33:45

1

试试这个:

awk -F\; '{print $1,$4}' test.bed 
+1

这将不允许输出根据需要分开。 – 2013-05-14 09:24:59

+1

这也适用 - 但我想我将不得不指定输出,如果输入不是选项卡分离。 – user53416 2013-05-14 09:27:16