我正在尝试比较同一文件的列。该表如下所示:
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