Tenho arquivos de texto longos com campos delimitados por espaço:
cat file1.txt
Id leng sal mon
25671 34343 56565 5565
44888 56565 45554 6868
23343 23423 26226 6224
77765 88688 87464 6848
66776 23343 63463 4534
cat file2.txt
Id number
25671 34343
76767 34234
23343 23423
66776 23343
cat output.txt
Id leng sal mon
44888 56565 45554 6868
77765 88688 87464 6848
file1.txt
tem quatro colunas, file2.txt
tem duas colunas. Quero comparar a primeira coluna ( $1
) em ambos os arquivos ( file1.txt
, file2.txt
) e gerar o arquivo que não corresponde em file2.txt
.
eu tentei
join -v1 file1.txt file2.txt >output.txt
Mas a saída contém alguns erros. Qualquer comando awk
/ sed
é apreciado.
Responder1
Para usar join
, você precisa ter certeza de que FILE1 e FILE2 estãoclassificadonos campos de junção.
O seguinte comando deve resolver o problema:
join -v1 <(sort file1.txt) <(sort file2.txt)
Responder2
Assim, mas não inclui a linha de cabeçalho:
$ awk '{print $1}' file2.txt | grep -vf - file1.txt
44888 56565 45554 6868
77765 88688 87464 6848
Nota: ajustei isso para corresponder ao resultado do exemplo, não à sua descrição. Se você quiser o contrário, basta alternar arquivo1 e arquivo2.
Dividindo isso:
awk
imprime apenas o campo 1 defile2.txt
grep -v
inverte a correspondência (imprime linhas não correspondentes)-f -
dizgrep
para ler a lista de padrões de correspondência de um arquivo, neste caso-
(STDIN
), que foi canalizado deawk