Combine em duas listas e faça uma coluna booleana

1

Eu tenho duas listas, a primeira lista contém todos os nomes

$ cat file1.txt
dog_02
dog_01
dog_20
dog_22
dog_23
dog_24

E minha segunda lista tem alguns nomes do primeiro

$ cat file2.txt
dog_01
dog_23
dog_24

Eu gostaria de fazer um pareamento entre as duas listas e obter uma saída booleana

dog_02 
dog_01 dog_01
dog_20
dog_22
dog_23 dog_23
dog_24 dog_24

if (empty) {print "0"} else {print "1"} ; feito > boolean_output.txt

$ cat boolean_output.txt

dog_02   0
dog_01   1
dog_20   0
dog_22   0
dog_23   1
dog_24   1

obrigado pelo seu tempo

    
por Irving El Pelofino Lopez 15.11.2017 / 17:49

2 respostas

1

awk solução:

awk 'NR==FNR{ a[$1]; next }{ printf "%s\t%d\n",$1,($1 in a) }' file2.txt file1.txt > boolean_output.txt
  • { a[$1]; next } - capturando todos os valores do primeiro arquivo de entrada, ou seja, file2.txt
  • ($1 in a) - a condição crucial para verificar os nomes correspondentes durante o processamento do segundo arquivo de entrada file1.txt

O conteúdo final de boolean_output.txt :

dog_02  0
dog_01  1
dog_20  0
dog_22  0
dog_23  1
dog_24  1
    
por 15.11.2017 / 17:58
0

Semelhante a resposta do RomanPerekhrest , mas de maneira diferente, uma vez que resultará 0 para os nomes se forem únicos somente no arquivo2 também , mais isso é ordem independente dos arquivos de entrada para awk , então isso funcionará para N número de arquivos de entrada cujo propósito é Nomes Únicos resultarão em 0 e os duplicados resultarão com < strong> 1 em média.

awk '{s[$1]=s[$1]?"1":"0"} END{for (x in s) print x,s[x]}' file*
    
por 15.11.2017 / 18:40