LINUX / PERL:将一行分成多行

时间:2014-09-15 14:30:28

标签: linux perl

我输入文件的内容 - 测试:

tang 123 gene gene 3000 1000 4000 
  • 5h柱是碱基对中基因的大小。
  • 第6列是基因位置的起点;
  • 第7列是基因位置的终点。

我想将这一行分成多行,每行600个碱基对,直到结束点之前。

我想要这样的结果:

tang 123 gene gene 600 1000 1600 
tang 123 gene gene 600 1600 2200 
tang 123 gene gene 600 2200 2800 
tang 123 gene gene 600 2800 3400
tang 123 gene gene 600 3400 4000

为了得出这些结果,我该怎么做?我可以只编写命令行还是需要编写脚本?

2 个答案:

答案 0 :(得分:3)

Quick one liner:

echo tang 123 gene gene 3000 1000 4000 |\
perl -ale '$F[4] = 600; print "@F[0..5] ",$F[5]+=$F[4] while $F[5] < $F[6]'

对于每一行,将其拆分为字段0到6,并将字段4替换为600。

然后打印字段0..5,按字段4增加字段5并将其打印到字段6的位置,而字段5小于字段6。

答案 1 :(得分:-1)

awk代码:

echo "tang 123 gene gene 600 1000 4000" | awk '{prefix=$1" "$2" "$3" "$4" "$5;step=$5;start=$6;end=$7} END{for(i=start;i<end;i+=step) {tmp=i+step; print prefix" "i" "(tmp<end?tmp:end)}}'

结果:

tang 123 gene gene 600 1000 1600
tang 123 gene gene 600 1600 2200
tang 123 gene gene 600 2200 2800
tang 123 gene gene 600 2800 3400
tang 123 gene gene 600 3400 4000

如果输入是&#34; tang 123基因基因700 1000 4000&#34;

结果:

tang 123 gene gene 700 1000 1700
tang 123 gene gene 700 1700 2400
tang 123 gene gene 700 2400 3100
tang 123 gene gene 700 3100 3800
tang 123 gene gene 700 3800 4000