【问题标题】:Bash extract last n characters, compare to separate columnBash 提取最后 n 个字符,与单独的列进行比较
【发布时间】:2014-03-05 17:17:07
【问题描述】:

我有一个包含以下列的输入文件:

'-'    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}}'

有什么想法吗?

提前致谢。

【问题讨论】:

  • ins={$x[2]: -$n_base} 是一种 shell 语言结构。 awk 不是 shell,awk 是一个可以从 shell 调用的工具,就像cutgrep 等一样。此外,您可以通过命名变量来获取 awk 变量的值,就像在 C 中一样,而不是通过粘贴$ 在它前面,就像在 shell 中一样。获取阿诺德·罗宾斯 (Arnold Robbins) 的书 Effective Awk Programming, Third Edition

标签: string bash awk extract


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为这会做你想要的:

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

    【讨论】:

    • split 的第三个参数是一个 RE。通过不使用 RE 分隔符 '/.../' 您告诉 awk 您的 RE 在一个字符串中,这将导致它被解析两次,一次是在读取脚本时,然后在执行脚本时再次解析。这对于您现在拥有的单个字符无关紧要,但对于其他分隔符来说,您不得不双重转义 RE 元字符,这会给您带来很多痛苦。只需使用 RE 分隔符,除非您有非常具体的理由不使用(例如,将字符串文字与变量连接):split($3,parts,/>/).
    • 另外,去掉虚假的尾随分号,在你的最终条件之后你不需要{print},因为这是默认操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多