
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 defile2
para construir chaves de arrayNR
mantém registros do número total de registros lidos até o momento,FNR
possui 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)
parafile1
arquivo, 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 eawk -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 f
entre 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