2014-02-08 22 views
0

我有一个包含以下几列的输入文件:猛砸提取物最后n个字符,比较分离柱

'-' CT C>CCT 
'-' TA G>GTA 
'-' TAT A>ATAT 

基本上,我想测试箭头后的最终n个字符的第3列是否与第2列的内容相同,其中n是箭头前后字母之间的长度差异。

看来,我迄今为止试过的所有东西都引发了一个错误。我在想以下几行:

awk -F"\t" '{split($3,x,">"); 
{n_base=length(x[2])-length(x[1]); 
ins={$x[2]: -$n_base}; 
if($2 == $ins) {print $0}}' 

有什么想法?

在此先感谢。

+0

'插件= {$ x [2]: - $ n_base}'是一个shell语言结构。 awk不是shell,awk是一个可以从shell调用的工具,就像'cut','grep'等一样。另外,通过命名变量来获得awk变量的值,就像在C中一样,而不是通过粘贴在它前面的'$'就像你在shell中做的一样。获得Arnold Robbins编写的“Effective Awk Programming,Third Edition”一书。 –

回答

1

你没有表现出任何样本输出,所以这是一个猜测,但它听起来就像你想要的是:

$ awk -F'[\t>]' '$2==substr($4,length($3)+1)' file 
'-'  CT  C>CCT 
'-'  TA  G>GTA 
'-'  TAT  A>ATAT 
+1

并感谢您的指点! – user2232814

0

我认为这会做你想要什么:

awk -F'\t' ' 
     { 
      split($3, parts, ">"); 
      fl = length(parts[2]) 
      check = substr(parts[2], fl-length($2)+1) 
     } 

     $2 == check {print} 
     ' 
+2

分裂的第三个参数是RE。通过不使用RE分隔符'/.../',您告诉awk您的RE在一个字符串内部,这会导致它被解析两次,一次是脚本被读取,另一次是被执行。这对你现在使用的单个字符无关紧要,但对于其他分隔符会导致很多不必要的双重转义RE元字符。只要使用RE分隔符,除非你有一个非特定的原因(例如,将字符串字面值与一个变量连接):'split($ 3,parts,/> /)'。 –

+0

另外,在最终条件之后,因为这是默认操作,所以会丢失伪随机分号并且不需要{{print}'。 –