Correspondendo dois arquivos, linha por linha?

Correspondendo dois arquivos, linha por linha?

Eu tenho dois arquivos que consistem em números. Agora, quero combinar a linha do primeiro arquivo com todas as linhas do segundo arquivo e aumentar o contador se a correspondência for encontrada. Como escrever o script bash para isso?

file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3

Responder1

Supondo file1.txte file2.txttemos conjuntos de números como este:

file1.txt:

1
2
4
6
7

file2.txt:

2
6
7
8
9

Você pode tentar algumas abordagens, dependendo do que deseja fazer com os dados ou do que mais deseja coletar ao longo do caminho.

  • Grep pode pesquisar em um arquivo uma string de padrão. Os padrões podem ser fornecidos usando outro arquivo usando o -fsinalizador. O -xsinalizador também garante que você encontre apenas correspondências de linhas inteiras, para que um padrão de '2' não corresponda a '24'. Finalmente a -cbandeira conta o número de partidas. Juntando tudo você teria:

    grep -x -c -f file1.txt file2.txt
    
  • Se você quiser fazer outras coisas com os números ao longo do caminho, além de obter uma contagem total, poderá adotar uma abordagem mais manual:

    counter=0
    while read number; do
        grep -q -x "$number" file2.txt && let counter=$counter+1
    done < file1.txt
    echo $counter
    

    Isso é muito menos eficiente, pois você está lendo o arquivo2.txt novamente para cada linha do arquivo1.txt, mas se você também quiser fazer outras coisas com o número ou manipular o arquivo ao longo do caminho, seria mais fácil corrigir um loop como que. Não é o uso do -qsinalizador, então grep é silencioso e retorna apenas um código de saída. Usando esse código podemos saber se uma correspondência foi encontrada ou não e apenas incrementar o contador se for.

De qualquer maneira que você trabalhar com isso, leve em consideração a possibilidade de que algumas linhas sejam correspondências parciais para números que são substrings de outros números. Além disso, você precisa pensar no que deseja que aconteça se houver mais de uma correspondência por linha. Cada duplicata incrementa o contador ou isso acontece apenas uma vez. Observe que as duas opções acima tratam isso de maneira diferente! Para alguns conjuntos de dados, eles darão resultados diferentes. Se você quisesse que eles dessem os mesmos resultados, ambas as técnicas poderiam ser adaptadas. Por exemplo, o primeiro poderia verificar uma versão do arquivo que tenha todas as duplicatas removidas para que nada corresponda mais de uma vez:

 grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)

informação relacionada