Como agrep
parece não estar presente em seu sistema, dê uma olhada nesta alternativa com base em sed e awk para aplicar grep com e operação a partir de padrões lidos por um arquivo local.
PS: Já que você usa o osx, não tenho certeza se a versão do awk tem suporte para uso abaixo.
awk
pode simular o grep com AND operação de múltiplos padrões neste uso:
awk '/pattern1/ && /pattern2/ && /pattern3/'
Você pode transformar o seu arquivo padrão a partir disso:
$ cat ./tmp/d1.txt
"surveillance data" "surveillance technology" "cctv camera"
"social media" "surveillance techniques" "enforcement agencies"
"social control" "surveillance camera" "social security"
"surveillance data" "security guards" "social networking"
"surveillance mechanisms" "cctv surveillance" "contemporary surveillance"
Para isso:
$ sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' ./tmp/d1.txt
/surveillance data/ && /surveillance technology/ && /cctv camera/
/social media/ && /surveillance techniques/ && /enforcement agencies/
/social control/ && /surveillance camera/ && /social security/
/surveillance data/ && /security guards/ && /social networking/
/surveillance mechanisms/ && /cctv surveillance/ && /contemporary surveillance/
PS: Você pode redirecionar a saída para outro arquivo usando >anotherfile
no final ou usar a opção sed -i
para fazer alterações no local no mesmo arquivo padrão de termos de pesquisa.
Então você só precisa alimentar o awk com padrões formatados por awk a partir desse arquivo padrão:
$ while IFS= read -r line;do awk "$line" *.txt;done<./tmp/d1.txt #d1.txt = my test pattern file
Você também não pode transformar os padrões em seu arquivo de padrão original aplicando sed em cada linha desse arquivo de padrão original da seguinte forma:
while IFS= read -r line;do
line=$(sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' <<<"$line")
awk "$line" *.txt
done <./tmp/d1.txt
Ou como uma linha:
$ while IFS= read -r line;do line=$(sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' <<<"$line"); awk "$line" *.txt;done <./tmp/d1.txt
Os comandos acima retornam os resultados corretos de AND em meus arquivos de teste com esta aparência:
$ cat d2.txt
This guys over there have the required surveillance technology to do the job.
The other guys not only have efficient surveillance technology, but they also gather surveillance data by one cctv camera.
$ cat d3.txt
All surveillance data are locked.
All surveillance data are locked and guarded by security guards.
There are several surveillance mechanisms (i.e cctv surveillance, contemporary surveillance, etv)
Resultados:
$ while IFS= read -r line;do awk "$line" *.txt;done<./tmp/d1.txt
#or while IFS= read -r line;do line=$(sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' <<<"$line"); awk "$line" *.txt;done <./tmp/d1.txt
The other guys not only have efficient surveillance technology, but they also gather surveillance data by one cctv camera.
There are several surveillance mechanisms (i.e cctv surveillance, contemporary surveillance, etv)
Atualização:
A solução awk acima exibe o conteúdo dos arquivos txt correspondentes.
Se você deseja exibir os nomes dos arquivos em vez do conteúdo, use o seguinte awk, se necessário:
awk "$line""{print FILENAME}" *.txt