我有一个看起来像这样的文件(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'比较新,所以我猜这是语法错误。任何帮助将不胜感激。
答案 0 :(得分: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
的值并且拆分不是条件。它们是应该在块内的语句。 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
答案 1 :(得分:1)
试试这个:
awk -F\; '{print $1,$4}' test.bed