1

我有一个看起来像这样的文件(test.bed)(可能不是制表符分隔的):

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'相当陌生,所以我猜这是语法错误。任何帮助,将不胜感激。

4

2 回答 2

1

尝试这个 :

awk -F\; '{print $1,$4}' test.bed
于 2013-05-14T09:19:32.290 回答
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}'
  • awkis的语法condition{block}和设置的值OFS和拆分不是条件。它们是应该在块内的语句。
  • 但是,您确实不需要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
于 2013-05-14T09:18:33.837 回答