如果一列部分匹配另一列则匹配

如果一列部分匹配另一列则匹配

我正在尝试比较同一文件的列。该表如下所示:

  G  A  AA  GG CC TT CT
  C  T  CC  TT GG GG AA

我想做的是将第一列和第二列与其余列进行比较,看看它们是否包含第一列或第二列的一部分。

像这样的东西:

awk '$1 == ^$3 || $2 == ^$3 {print $0}' File.txt

或者像这样

awk '$1 ~ /$3/ || $2 ~ /$3/ {print $0}' File.txt

但不工作。如何在列之间进行此类比较?

答案1

你的比较是倒退的。请尝试以下替代方案:

awk '$3 ~ $1 || $3 ~ $2 { print }' inputfile
awk 'match( $3, $1 ) || match( $3, $2 ) { print }' inputfile

在您的示例代码中,您尝试将$1 ~ $3其扩展为C ~ /CC/(表达式是否/CC/与字符串匹配C?)而不是CC ~ /C/(表达式是否/C/与字符串匹配CC?)。

答案2

$ awk '{ for (i=3; i<=NF; ++i) if (match($i,$1) || match($i,$2)) { print; next } }' file
G A AA GG CC TT CT
C T CC TT GG GG AA

在一个文件上进行测试,其中两行测试失败,两行测试成功:

$ cat file
G A AA GG CC TT CT
C T AG AA GG GG AA
G C AA AA TT TT AT
C T CC TT GG GG AA

$ awk '{ for (i=3; i<=NF; ++i) if (match($i,$1) || match($i,$2)) { print; next } }' file
G A AA GG CC TT CT
C T CC TT GG GG AA

awk脚本会遍历从第 3 列开始的所有列,并将每列与第 1 列和第 2 列进行比较。如果第 1 列或第 2 列中的字符出现在任何其他列中,则立即打印该行,并且脚本继续执行下一行。

答案3

尝试(使用从 Kusalananda 样本中窃取的数据)

awk '{PAT = "[" $1 $2 "]"} gsub (PAT, "&") > 2' file
G A AA GG CC TT CT
C T CC TT GG GG AA

答案4

你可以尝试这个方法:

grep -P '^(\S+) (\S+) .*(\1|\2)' gene.file

相关内容