Corresponde se uma coluna corresponder parcialmente a outra coluna

1

Estou tentando comparar colunas do mesmo arquivo. A tabela é assim:

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

O que eu quero fazer é comparar a primeira e a segunda colunas com o restante e ver se elas contêm parte da primeira ou segunda coluna.

Algo parecido com isto:

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

ou assim

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

Mas não está funcionando. Como posso fazer esses tipos de comparações entre colunas?

    
por Eric González 07.08.2018 / 17:42

4 respostas

1

Você tem suas comparações de trás para frente. Tente estas alternativas:

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

Em seu código de amostra, você estava tentando $1 ~ $3 , que expande para C ~ /CC/ (a expressão /CC/ corresponde à string C ?) em vez de CC ~ /C/ (a expressão /C/ corresponde à string CC ?).

    
por 07.08.2018 / 17:55
1
$ 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

Teste em um arquivo em que o teste falha em duas linhas e é bem-sucedido em duas linhas:

$ 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

O script awk percorre todas as colunas da coluna 3 em diante e compara cada coluna com a coluna 1 e 2. Se o caractere na coluna 1 ou 2 estiver presente em qualquer uma das outras colunas, a linha será imediatamente impressa e a coluna o script continua com a próxima linha.

    
por 07.08.2018 / 18:58
0

Tente (com dados roubados da amostra de Kusalananda)

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

Você pode tentar essa abordagem:

grep -P '^(\S+) (\S+) .*(|)' gene.file
    
por 07.08.2018 / 21:39