Awk - Corresponde valores entre dois arquivos e cria um novo arquivo

3

Eu tenho dois arquivos que estou tentando comparar e crie um arquivo final.txt com dados que existem de ambos os arquivos.

Arquivo1 - coluna 1 e Arquivo2 - colunas 2 contêm o valor que preciso corresponder entre os dois arquivos.

Então, essencialmente, estou tentando - > pegue coluna1 do Arquivo1, se houver uma correspondência na coluna2 do arquivo2, escreva Arquivo1Coluna1, Arquivo1Coluna2 e Arquivo2Coluna1 em um novo arquivo chamado final.txt.

EXEMPLO

Arquivo 1

1000,Brian
1010,Jason
400,Nick

Arquivo 2

3044 1000
4466 400
1206 1010

Arquivo final.txt para se parecer com

1000,Brian,3044
1010,Jason,1206
400,Nick,4466

Eu acredito que eu deveria ser capaz de fazer isso com o awk, mas por alguma razão eu estou realmente lutando com isso. Qualquer ajuda seria muito apreciada.

Obrigado

    
por user513110 23.08.2016 / 15:50

1 resposta

4

Aqui está uma maneira:

$ awk -F"[, ]" 'NR==FNR{a[$1]=$1","$2; next} ($2 in a){print a[$2]","$1}' file1 file2 
1000,Brian,3044
400,Nick,4466
1010,Jason,1206

O -F"[, ]" define o separador de campos como um espaço ou uma vírgula. FNR é o número da linha atual e NR do número da linha atual do arquivo atual. Os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. Portanto, NR==FNR{a[$1]=$1","$2; next} será executado apenas nas linhas do primeiro arquivo e salvará o primeiro e o segundo campos (com uma vírgula no meio) como valores na matriz a cujas chaves são os primeiros campos. Então, quando o segundo arquivo estiver sendo lido, se o segundo campo estiver em a , imprimiremos o valor associado a ele (o primeiro e o segundo campos do primeiro arquivo) e o primeiro campo do segundo arquivo.

Dito isso, há realmente um aplicativo para isso! Esse tipo de coisa é para o qual join foi feito. Infelizmente, como os seus dois arquivos não estão classificados e possuem diferentes delimitadores, precisamos de alguns truques. Se o seu shell suporta <() , você pode fazer:

$ join -t, -1 1 -2 2 <(sort file1) <(sed 's/ /,/g' file2 | sort -t"," -k2) 
1000,Brian,3044
1010,Jason,1206
400,Nick,4466

O join -t, -1 1 -2 2 significa usar , como o delimitador e unir no primeiro campo do arquivo1 e no segundo campo do arquivo2. O sed apenas substitui espaços por vírgulas, por isso temos o mesmo delimitador em ambos os arquivos. O sort faz o que diz na garrafa: classifica sua entrada.

    
por 23.08.2016 / 16:00