awk - compara 2 arquivos e imprime colunas de ambos os arquivos

3

Eu postei algo parecido há um tempo atrás e pensei, o código fornecido poderia ajudar a resolver meu problema, porém infelizmente eu não sou capaz de ajustá-lo às minhas necessidades: awk - comparar arquivos e imprimir linhas de ambos os arquivos

Então, eu tenho novamente 2 arquivos separados por tabulações.

arquivo_1.txt

apple    2.5    5     7.2
great    3.8    10    3.6
see      7.6    3     4.9
tree     5.4    11    5
back     8.9    2     2.1

arquivo_2.txt

apple    :::N
back     :::ADJ
back     :::N      
around   :::ADV      
great    :::ADJ         
bee      :::N         
see      :::V      
tree     :::N         

A saída deve se parecer com:

apple    :::N      2.5    5     7.2     
great    :::ADJ    3.8    10    3.6
back     :::ADJ    8.9    2     2.1
back     :::N      8.9    2     2.1
see      :::V      7.6    3     4.9
tree     :::N      5.4    11    5 

A diferença para o outro post é que eu apenas gosto de comparar as primeiras colunas de file_1.txt e file_2.txt e, em seguida, imprimo a linha inteira de file_1.txt com a coluna 2 de file_1.txt no outfile. Eu não me importo em qual ordem $ 2 de file_2.txt é impressa no outfile, então o arquivo de saída também poderia se parecer com

back     8.9    2     2.1    :::N
back     8.9    2     2.1    :::V etc.

O problema são as duplicatas na coluna1 como aqui. Caso contrário, eu poderia apenas usar paste . O problema com este 'comando-awk é que ele não lê coluna2 em uma matriz e se eu disser para imprimi-lo, isso não é possível, é claro.

awk 'NR==FNR {a[$1]; next} $1 in a {print $0, a[$2]}' OFS='\t' file_2.txt file_1.txt > outfile.txt

Estou feliz em receber ajuda! Desculpe pela estupidez aqui também, parece que estou completamente perplexo.

    
por dani_anyman 07.03.2017 / 16:55

1 resposta

3

Se você tem o GNU awk (disponível no repositório via pacote gawk ), que suporta matrizes multidimensionais, você poderia fazer

gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt

Ex.

$ gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt
apple   2.5     5       7.2     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N

Caso contrário, se a ordem de saída não for importante, a solução mais fácil é provavelmente usar o comando join :

$ join -t $'\t' <(sort file_1.txt) <(sort file_2.txt)
apple   2.5     5       7.2     :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
    
por steeldriver 07.03.2017 / 17:23