awk:如何比较一行中的两个字符串

时间:2016-11-27 14:30:28

标签: bash awk

我有一个包含20 000个探针的数据集,它们分为两列,每列21个。从这个文件中我需要提取探针1列中最后一个核苷酸与探针2列中最后一个核苷酸匹配的行。到目前为止,我尝试了AWK(substr)函数,但没有得到预期的结果。这是我试过的单线:

awk '{if (substr($2,21,1)==substr($4,21,1)){print $0}}'

另一种选择是在第2列和第4列(awk '$2~/[A-Z]$/)中锚定最后一个字符,但我找不到使用正则表达式匹配两列中探针的方法。所有建议和意见将非常感谢。

数据集示例:

        Probe 1                     Probe 2
4736    GGAGGAAGAGGAGGCGGAGGA   A   GGAGGACGAGGAGGAGGAGGA
4737    GGAGGAAGAGGAGGGAGAGGG   B   GGAGGACGAGGAGGAGGAGGG
4738    GGAGGATTTGGCCGGAGAGGC   C   GGAGGAGGAGGAGGACGAGGT
4739    GGAGGAAGAGGAGGGGGAGGT   D   GGAGGACGAGGAGGAGGAGGC
4740    GGAGGAAGAGGAGGGGGAGGC   E   GGAGGAGGAGGACGAGGAGGC

期望的输出:

4736    GGAGGAAGAGGAGGCGGAGGA   A   GGAGGACGAGGAGGAGGAGGA
4737    GGAGGAAGAGGAGGGAGAGGG   B   GGAGGACGAGGAGGAGGAGGG
4740    GGAGGAAGAGGAGGGGGAGGC   E   GGAGGAGGAGGACGAGGAGGC

1 个答案:

答案 0 :(得分:5)

这将过滤输入,匹配第二列的最后一个字符等于第四列的最后一个字符的行:

awk 'substr($2, length($2), 1) == substr($4, length($4), 1)'

与示例脚本相比,我改变了什么:

  • if声明移出{ ... }块进入过滤器
  • 使用length($2)length($4)代替硬编码值21
  • 不需要{ print $0 },因为这是匹配行的默认操作