Comparar duas colunas de arquivo

6

Eu 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 a saída do arquivo que não correspondeu em file2.txt .

Eu tentei

join -v1 file1.txt file2.txt >output.txt

Mas a saída tem alguns erros. Qualquer comando awk / sed é apreciado.

    
por jack 29.06.2012 / 18:15

2 respostas

9

Para usar join , você precisa se certificar de que FILE1 e FILE2 sejam classificados nos campos de associação.

O seguinte comando deve fazer o truque:

join -v1 <(sort file1.txt) <(sort file2.txt)
    
por 29.06.2012 / 18:53
5

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 da outra maneira, apenas mude o arquivo1 e o arquivo2.

Quebrando isso:

  • awk imprime apenas o campo 1 de file2.txt
  • grep -v inverte a correspondência (imprime linhas não correspondentes)
  • -f - informa grep para ler a lista de padrões de correspondência de um arquivo, neste caso - ( STDIN ), que foi enviado de awk
por 29.06.2012 / 20:46

Tags