Posso fazer dois arquivos uns contra os outros?

0

Eu quero o arquivo A para cada frase no arquivo B, onde uma frase é uma cadeia de palavras de tamanho X. Idealmente, seria um grep aproximado, como agrep . Existe uma maneira de fazer isso usando ferramentas de linha de comando?

Arquivo A:

"Era uma vez uma história sobre bananas no espaço."

Arquivo B:

"Se há uma coisa que eu não estou preocupado, bananas no espaço não são tão preocupantes."

Saída:

Frase "bananas no espaço" encontrada no Arquivo A linha 1, arquivo B linha 1.

(e pode destacar a frase no contexto, como o grep faz.)

    
por Jon 26.02.2016 / 17:41

3 respostas

1

Você pode tentar o seguinte no bash:

while read line  
do  
   grep "$line" fileA  
done < fileB
    
por 26.02.2016 / 17:45
1

O que você deseja fazer é sobre qualquer ferramenta de linha de comando, isso é feito por programas com capacidade de pesquisa de texto completo. Algo muito menos é alcançável usando o awk:

$ cat fts.awk
{ gsub( /[[:space:],."!?]+/, " ") }

FILENAME == "A" {
   A[++cntA] = $0
   next
}

FILENAME == "B" {
   for ( nrA=1; nrA<=cntA; ++nrA) {
      for ( first=1; first<=NF; ++first) {
         for ( last=first; last<=NF; ++last) {
            lookfor = (last == first) ? $first : lookfor " " $last
            #print "lookfor=", lookfor
            #print "<", A[nrA]
            if ( index(A[nrA], lookfor)) {
               #print "FOUND>", found, nrA, NR
               found = lookfor
            } else if (found) {
               printf "Phrase \"%s\" found in File A line %d, file B line %d.\n",\
                   found, nrA, FNR
               found = ""
               break
            }
         }
      }
   }
}

Que pode ser chamado como:

$ awk -f fts.awk A B
Phrase "bananas in space" found in File A line 1, file B line 1.
Phrase "in space" found in File A line 1, file B line 1.
Phrase "space" found in File A line 1, file B line 1.

Como você pode ver, o código já está se tornando complexo, embora dificilmente faça parte da sua lista de recursos, ele não tem nem memória para eliminar a exibição de subfindos.

    
por 26.02.2016 / 20:05
0

Vamos simplificar isso um pouco e depois construir a alma.

Você pode grep um arquivo com padrões de um arquivo usando a opção -f. Então você poderia fazer algo assim.

grep -f file_patterns file_haystack

Você pode usar a substituição de processos para fazer com que a saída de um processo aja como um arquivo

cat <( grep pattern file )

Se você colocar isso junto, você pode grep um arquivo baseado na saída de um comando grep como este.

grep -f <( grep pattern file_a ) file_b

Eu suponho que você pode descobrir o padrão por si mesmo, porque não está claro para mim a partir de sua descrição, o que isso deveria ser.

    
por 26.02.2016 / 19:27

Tags