Shell compara duas listas e gera a diferença em uma terceira lista

1

Eu tenho dois arquivos de texto, a.txt e b.txt, onde:

a.txt

1
2
3
4
5

b.txt

3
5

Eu gostaria de ter o c.txt onde os números correspondentes serão impressos "0" e os números não correspondentes serão "1".

1
1
0
1
0

Eu entendo que a comunicação pode suprimir / imprimir linhas exclusivas, mas como posso obter o c.txt acima?

Muito obrigado.

    
por Naj1k 13.02.2017 / 22:29

4 respostas

2

Como don_crissti apontou, com awk é bem simples:

awk 'FNR==NR { match_nmbrs[$1]++; next;}
             {if($1 in match_nmbrs)
                  print 0;
              else
                  print 1; }
    ' b.txt a.txt

A primeira condição {...} funciona de forma eclusa nos registros do primeiro arquivo, enquanto a segunda condição {...} funciona exclusivamente nos registros do segundo arquivo. Todas as outras coisas são auto-explicativas.

    
por 13.02.2017 / 23:35
2

Use awk na comm output:

$ comm a.txt b.txt | awk -F'\t' '$1 || $2 { print 1 } $3 { print 0 }'

comm produzirá três colunas separadas por tabulações:

  1. linhas apenas no primeiro arquivo,
  2. linhas apenas no segundo arquivo e
  3. linhas presentes nos dois arquivos.

O script awk classifica qualquer entrada que tenha algo em qualquer uma das duas primeiras colunas como uma "incompatibilidade" e a saída 1 , e se houver algo na terceira coluna, a saída será 0 para uma correspondência .

Observe que comm requer que os dois arquivos sejam classificados.

    
por 13.02.2017 / 22:49
1

Se você quisesse mexer com diff e não participar, aqui está outra opção.

sdiff -l a.txt b.txt | sed -e 's/.*<.*/1/' -e 's/.*(.*/0/'

Provavelmente, você poderia obter uma expressão sed melhor nela ou alterá-la usando awk , mas será uma ação rápida e, em seguida, apenas redirecione isso para c.txt

    
por 13.02.2017 / 22:58
0

Aqui está outra awk solution

awk '1,$0=system("grep -qx "$1" b.txt")' a.txt
    
por 14.02.2017 / 00:17