Comparando dois arquivos em um script

1
#!/bin/bash
while read file1 <&3; do
     while read file2 ; do       
        if [ $file1 == $file2 ] ; then
         $file1 >> /infanass/dev/admin/test/newlist.txt
        fi
    echo "$file1"
    echo "$file2"
 done 3</infanass/dev/admin/test/file2.txt
done 3</infanass/dev/admin/test/file1.txt

Eu quero ler uma linha do arquivo1.txt e, em seguida, percorrer o arquivo2.txt e ver se há uma correspondência e se também há um novo arquivo de texto ..

Acho que tenho um loop infinito ...

    
por mkrouse 16.07.2013 / 19:47

3 respostas

3

Que tal uma abordagem mais simples?

while read line do
    grep "^$line$" file2.txt >>matches.txt
done < file1.txt

Explicação:

Isso percorre file1.txt linha por linha e usa grep para procurar a linha exata em file2.txt . Agora, grep produzirá a linha novamente se conseguir corresponder em file2.txt e, em seguida, será redirecionada (anexada) ao arquivo matches.txt .

A razão pela qual seu script está travando é que seu segundo loop está aguardando entrada em stdin : você esqueceu de tornar sua stdin uma duplicata do descritor de arquivo 3 como você fez com a primeira. Em qualquer caso, nenhum descritor de arquivo extra precisa ser criado: você pode apenas redirecionar stdin para que o loop while seja lido de um arquivo e não do terminal.

    
por 16.07.2013 / 19:51
0

Use comm para encontrar a interseção:

comm -12 <(sort file1.txt) <(sort file2.txt) > newlist.txt

comm requer que seus arquivos de entrada sejam classificados.

    
por 16.07.2013 / 20:45
0

Por que não simplificar ainda mais alimentando o arquivo1 como termos de pesquisa para o grep e deixando-o procurar em arquivo2 ?

$ grep -f file1 file2 > file3

Por favor, note que em algumas plataformas você precisa / quer egrep ou ggrep devido a problemas de desempenho.

    
por 24.04.2015 / 13:22

Tags