Se a coluna 2 do arquivo2 for diferente da coluna2 do arquivo1, imprimir coluna1 do arquivo1 e coluna2 dos dois arquivos

2

Eu tenho dois arquivos não classificados, cada um com duas colunas. Para qualquer linha no arquivo1 cujo valor column1 corresponda ao de qualquer linha no arquivo2, mas cujos valores da coluna 2 sejam diferentes, quero imprimir o valor da coluna 1 e o valor de cada coluna 2.

Se os dados da coluna1 no arquivo 1 não existirem no arquivo2, eles poderão ser descartados. Eu não preciso preservar a ordem de classificação no arquivo de saída.

file1: 

2222,b2
4444,d4
1111,a1
3333,c3
5555,e5

file2:

2222,8f
5555,e9
4444,7c
3333,c3


OUTPUT file:
2222,b2,8f
4444,d4,7c
5555,e5,e9
    
por Jdubyas 09.03.2018 / 00:01

4 respostas

0

Leia o segundo arquivo, salve o conteúdo em uma matriz (chave = primeiro campo, valor = segundo campo), depois leia o primeiro arquivo e verifique se o primeiro campo é uma chave comum e se o segundo campo correspondente é diferente. Se o resultado for positivo, imprima a chave e os dois valores:

awk 'BEGIN{FS=OFS=","}NR==FNR{z[$1]=$2;next}
{if (z[$1] && (z[$1]!=$2)){print $0, z[$1]}}' file2 file1
    
por 09.03.2018 / 01:01
0

EDIT: A pergunta originalmente escrita não era clara e faltava detalhes importantes. O que se segue são as duas respostas originais que escrevi à medida que a questão se desenvolveu com clareza. As respostas são boas para casos mais simples semelhantes à questão atualmente escrita.

  1. Para um caso de arquivos ordenados e correspondentes, eu recomendaria primeiro usar o utilitário de linha de comando paste para criar um terceiro arquivo temporário que seria o arquivo com a coluna dois do arquivo dois adicionado a cada linha. Canalize a saída desse comando paste para awk e, em seguida, sua solução awk se tornará trivial - $2 != $4{printf "%s %s %s", $1, $2, $4} .

    cole -d "," arquivo1 arquivo2 | awk 'BEGIN {FS=","; OFS=","} $ 2! = $ 4 {printf "% s,% s,% s", $ 1, $ 2, $ 4}'

  2. Para um caso de arquivos não correspondidos, se todas as chaves do arquivo1 e do arquivo2 forem idênticas, apenas sort da entrada para o paste . Você pode fazer esse tipo de coisa no bash shell, usando substituição do processo , com o formulário <( command ) , como no exemplo abaixo:

    cole -d "," < (arquivo de classificação1) < (arquivo de classificação2) | awk 'BEGIN {FS=","; OFS=","} $ 2! = $ 4 {printf "% s,% s,% s", $ 1, $ 2, $ 4}'

  3. Para um conjunto não ordenado e inigualável de arquivos (a pergunta como atualmente escrita), veja a resposta do usuário don_crissti.

por 09.03.2018 / 00:12
-1

Posso usar a associação?

sort -o file1 file1 
sort -o file2 file2 
join -t"," -1 1 -2 1 file1 file2 | awk '$2!=$3'
    
por 09.03.2018 / 17:02
-1
awk -F, 'NR==FNR {a[$1]=$2;next} {if (($1 in a) && a[$1] != $2) print $0","a[$1]}' file2 file1
    
por 11.03.2018 / 07:14