Veja um script sh
que produz os resultados de que você precisa.
#!/bin/sh
grep -f /path/to/patterns.txt /path/to/*_856_2017* | sort -u > /path/to/foundFiles.txt
while read -r LINE
do
grep -F "$LINE" /path/to/foundFiles.txt
if [ $? -eq 1 ]
then
echo "$LINE" not found
fi
done < /path/to/patterns.txt
Neste script, presumo que você envie os resultados de seu grep
para o arquivo found.txt
e armazene seus padrões no arquivo /path/to/foundFiles.txt
.
Como você pode ver, o grep
no loop produzirá o mesmo conteúdo do arquivo found.txt
ao adicionar "$pattern" not found
para os que faltam.
Eu também criei uma segunda abordagem para o seu caso:
#!/bin/sh
grep -f /path/to/patterns.txt /path/to/*_856_2017* |
sort -u > /path/to/foundFiles.txt
comm -23 /path/to/patterns.txt /path/to/foundFiles.txt |
xargs -L 1 -I {} echo {} not found > /path/to/notFoundFiles.txt
cat /path/to/foundFiles.txt /path/to/notFoundFiles.txt > /path/to/finalList.txt
Nesse caso, patterns.txt
precisa estar classificado para comm
para funcionar.
O comando comm
compara os dois arquivos que retornam as linhas presentes apenas em patterns.txt
( -23
parameter), que é a lista de padrões não encontrados por grep
.
Em seguida, xargs
pega cada linha ( -L 1
) e ecoa a linha ( {}
) com "não encontrado" anexada a ela. O resultado de xargs
é redirecionado para o arquivo notFoundFiles.txt
.
Finalmente, você simplesmente concatena foundFiles.txt e notFoundFiles.txt em finalList.txt
.