Correspondência de padrões e excluir toda a linha

1

Eu quero excluir todas as linhas do arquivo 1, se a coluna 1 do arquivo1 corresponder exatamente com a coluna 1 arquivo2.

Arquivo 1:

r001:21:10    21    AAAAAATTTGC    *     =    XM:21
r002:21:10    21    YAAAATTTGC     *     =    nM:21
r001:21:10    21    TTAAAATTTGC    *     =    XM:21
r0012:21:10   21    LLAAAATTTGC    *     +    XM:21
r001:21:10    21    AAAAAATTTGC    *     =    GM:21

Arquivo2:

r001:21:10
r001:21:20
r002:41:36
r002:41:99
r002:41:87
r0012:21:1

Resultado esperado:

r002:21:10    21    YAAAATTTGC     *     =    nM:21
r0012:21:10   21    LLAAAATTTGC    *     +    XM:21
    
por Namrata 28.02.2014 / 13:23

4 respostas

6

Você pode usar este awk :

$ awk 'FNR==NR {a[$i]; next}; !($1 in a)' f2 f1
r002:21:10    21    YAAAATTTGC     *     =    nM:21
r0012:21:10   21    LLAAAATTTGC    *     +    XM:21

Explicação

  • FNR==NR {a[$i]; next} lê o primeiro arquivo e salva o conteúdo no array a .
  • !($1 in a) ao ler o segundo arquivo, ele verifica se o primeiro campo está no array a . Se não, imprime a linha.
por 28.02.2014 / 13:27
2

Você também pode fazer

$ grep -wvFf file2 file1
r002:21:10    21    YAAAATTTGC     *     =    nM:21
r0012:21:10   21    LLAAAATTTGC    *     +    XM:21

De man grep :

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched. 
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.  
   -v, --invert-match
          Invert the sense of matching, to select non-matching lines. 
   -w, --word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-word
          constituent character.

OBSERVAÇÃO : no entanto, ele pesquisará a totalidade de cada linha de file1 , não apenas a primeira coluna.

    
por 28.02.2014 / 18:07
2

Se a ordem de saída não é importante e seu shell suporta substituição de processo (bash faz), você poderia usar join nos arquivos sorted :

join -v 1 <(sort -k1,1 file1) <(sort -k1,1 file2) | column -t
r0012:21:10  21  LLAAAATTTGC  *  +  XM:21
r002:21:10   21  YAAAATTTGC   *  =  nM:21

Explicação: join arquivos na primeira coluna, -v 1 = saída de linhas não correspondentes do primeiro arquivo. Os arquivos são sorted pela primeira coluna -k1,1 . O último column -t faz uma impressão bonita.

    
por 01.03.2014 / 20:58
-1

Parece que de outro segmento, eu consegui encontrar a resposta usando esse método,

Comparando dois arquivos usando o Unix e o Awk

FNR == NR {
  f1[$1,$2,$3] = $0
  f1_c14[$1,$2,$3] = 1
  f1_c5[$1,$2,$3] = $4
  next
}

f1_c14[$1,$2,$3] {
  if ($4 != f1_c5[$1,$2,$3]) print f1[$1,$2,$3] ;
}

f1[$1,$2,$3] {
  if ($4 != f1_c5[$1,$2,$3]) print $0;
}
    
por 06.05.2014 / 22:10