String Bash提取最后n个字符,与单独的列进行比较

String Bash提取最后n个字符,与单独的列进行比较,string,bash,awk,extract,String,Bash,Awk,Extract,我有一个输入文件,其中包含以下列: '-' CT C>CCT '-' TA G>GTA '-' TAT A>ATAT 基本上,我试图测试第3列中箭头后面的最后n个字符是否与第2列的内容相同,其中n是箭头前后字母的长度差 似乎到目前为止我所尝试的一切都出现了错误。我的想法如下: awk -F"\t" '{split($3,x,">"); {n_base=length(x[2])-length(x[1]); ins={$x[2

我有一个输入文件,其中包含以下列:

'-'    CT    C>CCT  
'-'    TA    G>GTA  
'-'    TAT    A>ATAT  
基本上,我试图测试第3列中箭头后面的最后n个字符是否与第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}}'
有什么想法吗


提前谢谢

我想这会满足你的要求:

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

        $2 == check {print}
        '

您没有显示任何示例输出,因此这是一个猜测,但听起来您想要的是:

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

ins={$x[2]:-$n_base}
是一种shell语言构造。awk不是shell,awk是一个可以从shell调用的工具,就像
cut
grep
等。此外,您可以通过命名变量来获得awk变量的值,就像在C中一样,而不是像在shell中一样在变量前面粘贴
$
。获取Arnold Robbins的书《有效的Awk编程,第三版》。split的第三个参数是RE。通过不使用RE分隔符“/…/”,您告诉awk您的RE在一个字符串中,这将导致它被解析两次,一次是在读取脚本时,另一次是在执行脚本时。这对于您现在拥有的单个字符来说并不重要,但是对于其他分隔符来说,必须双倍逃逸元字符会给您带来很多痛苦。只需使用重新分隔符,除非您有非常明确的理由不这样做(例如,将字符串文字与变量连接):
split($3,parts,/>/)
。此外,丢失伪尾随分号,并且在最终条件之后不需要
{print}
,因为这是默认操作。