Lê dados em dois arquivos, um contendo colunas e exibindo dados se corresponderem

0

Eu estou tentando comparar os dados em dois arquivos, um que tem colunas e, em seguida, deseja imprimir os dados encontrados em ambos

Arquivo 1:

item1
item2
item3

Arquivo2:

itemA item1
itemB item2
itemC item3

Portanto, eu gostaria de comparar o Arquivo 1 com a coluna 2 do Arquivo 2, se eles forem idênticos, eu gostaria de exibir a linha inteira.

Por exemplo, se file1 contiver:

data1
data2

e arquivo2 contém:

dataA data1
dataC data3

só exibiria:

dataA data1

como esta é a linha no arquivo2 com o item de dados no arquivo1

Muito obrigado antecipadamente

    
por Tom Apter 11.08.2017 / 12:23

1 resposta

3

Use grep :

grep -Fwf file1 file2

de man grep :

-F, --fixed-strings
    Interpret PATTERN as a list  of  fixed  strings  (instead  of  regular  expressions),  separated  by
    newlines, any of which is to be matched.

-f FILE, --file=FILE
    Obtain patterns from FILE, one per line.  If this option is used multiple times or is combined  with
    the -e (--regexp) option, search for all patterns given.  The empty file contains zero patterns, and
    therefore matches nothing.

-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.

Ou awk :

awk 'NR==FNR{seen[$0]++} ($2 in seen)' file1 file2

Acima, primeiro nós estamos lendo o arquivo1 e mantemos toda a coluna1 em uma matriz chamada vista , então olhamos no arquivo2 em sua segunda coluna e se ela é correspondida com a coluna1 salva do arquivo1, em seguida, vai imprimir toda a linha do arquivo2.

Você também tem o comando join se ambos os arquivos estiverem classificados (se não, você pode passar a saída classificada por sort ing):

join -1 1 -2 2 file1 file2

de man join

-1 FIELD
      join on this FIELD of file 1

-2 FIELD
      join on this FIELD of file 2

se os arquivos não forem classificados:

join -1 1 -2 2 <(sort file1) <(sort file2)
    
por 11.08.2017 / 12:31