Combinando dois arquivos, linha por linha? [fechadas]

1

Eu tenho dois arquivos que consistem em números. Agora, quero corresponder a linha do primeiro arquivo a toda a linha 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
    
por user3234277 14.06.2014 / 09:09

1 resposta

1

Supondo que file1.txt e file2.txt tenham 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.

  • O grep pode pesquisar em um arquivo por uma string padrão. Os padrões podem ser fornecidos usando outro arquivo usando o sinalizador -f . O sinalizador -x 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, o -c flag conta o número de correspondências. Juntando tudo você teria:

    grep -x -c -f file1.txt file2.txt
    
  • Se você quisesse fazer outras coisas com os números ao longo do caminho, além de outras que contam, você poderia 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 quando você está lendo o arquivo2.txt novamente para cada linha no arquivo1.txt, mas se você também quisesse fazer outras coisas com o número ou manipular o arquivo ao longo do caminho, seria mais fácil aplicar o patch em um loop assim. Não é o uso do -q flag então grep é silencioso e só retorna um código de saída. Usando esse código, podemos dizer se uma correspondência foi encontrada ou não e apenas incrementar o contador se for.

De qualquer forma que você trabalhe, certifique-se de levar em consideração a possibilidade de algumas linhas serem correspondências parciais para números que sejam sub-strings de outros números. Além disso, você precisa pensar sobre o que você quer que aconteça se houver mais de uma correspondência por linha. Cada duplicata incrementa o contador ou isso só acontece uma vez? Observe as duas opções acima lidar com isso de forma diferente! Para alguns conjuntos de dados, eles fornecerão resultados diferentes. Se você quisesse que eles dessem os mesmos resultados, ambas as técnicas poderiam ser adaptadas. Por exemplo, o primeiro pode verificar uma versão do arquivo que tenha todas as duplicatas removidas para que nada seja igual a mais de uma vez:

 grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)
    
por 14.06.2014 / 09:25

Tags