bash - awk:如何在一行中比较两个字符串

标签 bash awk

我有一个包含 20000 个探针的数据集,它们位于两列中,每列 21nts。从这个文件中,我需要提取 Probe1 列中的最后一个核苷酸与 Probe 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

最佳答案

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

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

与您的示例脚本相比,我所做的更改:

  • if 语句从 { ... } block 移到过滤器中
  • 使用 length($2)length($4) 而不是硬编码值 21
  • 不需要 { print $0 },因为这是匹配行的默认操作

关于bash - awk:如何在一行中比较两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40830060/

相关文章:

bash - Linux 命令在 shell 命令行中表现异常

bash - 在 Bash 中传递 -e 和 -n 作为位置参数

从另一个完成 Bash 完成

string - Bash- 打乱字符串中包含的字符

mysql - Bash 转义(MySQL GRANT ALL PRIVILEGES 失败)

linux - linux shell 中连字符 ("-") 的用法是什么?

sql - 将公共(public)列上长度不等的两个文件与 linux 命令行进行多次匹配

linux - 使用awk忽略CSV文件字段中的逗号

gawk 命令中的 JavaScript

linux - 在 Linux 中部分合并 2 个文本文件