Compare dois arquivos e imprima correspondências

6

Existe alguma maneira de obter isso através do shell script do Unix? Eu tenho um fileA com uma coluna (1000 linhas) e fileB com 26 colunas (13000 linhas). Eu preciso pesquisar cada valor de fileA com fileB e retornar todos os 26 valores de FileB se corresponder. O valor de pesquisa (do arquivo A) pode apresentar em qualquer um dos 26 valores no arquivo B. Este valor não é fixo em nenhuma das colunas no arquivo B.

FILEA:

abc
def
ghi

FILEB:

drm|fdm|pln|ess|abc|zeh|....|yer (26 values)
fdm|drm|def|ess|yer|zeh|....|pln

Aqui, abc do arquivo A é a quinta col. de FileB - então meu resultado deve ser todos os 26 valores do FileB.
Da mesma forma, def do arquivo A é a terceira col. de FileB -so meu resultado deve ser todos os 26 valores de FileB.

Dessa forma, é necessário fazer todo o conjunto de registros.

Se não for correspondido, ignore o registro.

    
por vamshi 17.09.2014 / 18:49

2 respostas

12

Você pode usar apenas grep :

grep -Fwf fileA fileB

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 is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)
   -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.  Similarly, it must be either at the  end
          of  the  line  or  followed by a non-word constituent character.
          Word-constituent  characters  are  letters,  digits,   and   the
          underscore.
    
por 17.09.2014 / 18:57
3

A ordem do arquivo A é importante? Você pode ter várias linhas no arquivo B com esse padrão? Isto irá, por exemplo, analisar o arquivo A e procurar por cada padrão no arquivo B:

while read i; do grep "$i" fileB; done < fileA

Mas você precisa definir melhor o problema para obter uma solução com mais desempenho. Por exemplo, é suficiente para obter toda a linha, você não precisa visualizá-la como 26 valores.

    
por 17.09.2014 / 21:10