Compare dois arquivos com base na primeira coluna

Compare dois arquivos com base na primeira coluna

Tenho dois arquivos e gostaria de obter um novo arquivo apenas com as linhas que temos no primeiro arquivo, mas não no segundo. Exemplo:

arquivo1:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Smith
3       Matthew          Freberg
4       Brenda           Something

arquivo2:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Willems
3       Jay              Freberg
5       Mike             Hart

Saída:

ID      firstname        lastname
4       Brenda           Something

Tentei usar comm, mas isso também fornece as linhas onde algo foi alterado, por exemplo, os ID 2 e 3.

Você pode por favor me ajudar com isso?

Responder1

$ awk 'NR==FNR{a[$1]; next} FNR==1 || !($1 in a)' file2 file1
ID      firstname        lastname
4       Brenda           Something
  • NR==FNR{a[$1]; next}Use a primeira coluna de file2para construir chaves de array
    • NRmantém registros do número total de registros lidos até o momento, FNRpossui o número do registro apenas para o arquivo atual que está sendo lido. Assim, NR==FNRé verdade apenas para o primeiro arquivo (assumindo que não esteja vazio)
  • FNR==1 || !($1 in a)para file1arquivo, imprima a linha do cabeçalho ou se a primeira coluna não for encontrada no arraya
  • Use awk -F'\t' '...'se sua entrada estiver separada por tabulação e awk -F, '...'por vírgula.

Se o primeiro arquivo puder estar vazio, use isto:

awk '!f{a[$1]; next} FNR==1 || !($1 in a)' file2 f=1 file1

Isso definirá um sinalizador fentre os dois arquivos.

Responder2

Em uma linha de comando bash, você pode fazer o seguinte. Filtre os IDs do arquivo2 e procure-os no arquivo1, mas apenas no início da linha:

$ grep -vf <(< file2 tail -n+2 | grep -Eo '^[^ ]{1,}'|sed 's/.*/^& /') file1
ID      firstname        lastname
4       Brenda           Something

informação relacionada