Linux

如果一列與另一列部分匹配,則匹配

  • August 7, 2018

我正在嘗試比較同一文件的列。該表如下所示:

 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

但不工作。如何在列之間進行此類比較?

你的比較倒過來了。請嘗試以下替代方案:

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?)。

$ 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

腳本從第awk3 列開始遍歷所有列,並將每列與第 1 列和第 2 列進行比較。如果第 1 列或第 2 列中的字元出現在任何其他列中,則立即列印該行並且腳本繼續下一行.

引用自:https://unix.stackexchange.com/questions/461100