我有一个包含 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/