Você pode tentar o seguinte no bash:
while read line
do
grep "$line" fileA
done < fileB
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.)
Você pode tentar o seguinte no bash:
while read line
do
grep "$line" fileA
done < fileB
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.
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.