Tenho 2 arquivos:
- um arquivo cheio de valores que eu quero procurar
- meu arquivo de texto fonte
Eu escrevi um comando shell curto para percorrer minha lista de valores e grep em relação ao meu arquivo de origem. Se não encontrar o valor no arquivo, quero imprimir o valor.
O problema é que ele está imprimindo todos os valores, então não estou obtendo o valor corretamente, portanto, ele sempre nunca corresponde e, em seguida, imprime o valor por causa disso. Espero que alguém possa me dizer o que estou fazendo de errado. Desde já, obrigado.
Aqui está o meu roteiro
for i in `cat uniq_val.out`
do
found=`grep "$i" fd.out`
if [ -z "${found}" ]
then
echo $i
fi
done
Então, por exemplo, se meu uniq_val.out contiver isso:
abc123
def456
ghi789
jkl101112
mno131415
E meu fd.out contém isto:
abc123
def456
mno131415
Eu quero que meu script de shell retorne
ghi789
jkl101112
Eu sugeriria a seguinte abordagem diferente:
ou seja, o interno
grep
usauniq_val.out
como um arquivo de padrão e retorna apenas a parte correspondente; o grep externo faz um inversogrep
desses valores em relação à lista.Pelo que sei
-o
, não é POSIX.EDITAR os seguintes arquivos de exemplo em questão:
Se ambos os arquivos forem realmente strings de linha única que precisam ser correspondidas apenas, inverta a lógica do que é o arquivo de padrão e use
-x
para correspondências de linha inteira:Isso é compatível com POSIX.
GNU coreutils fornece ferramentas para lidar com conjuntos de strings (classificadas). No seu caso, sugiro abandonar
grep
e fazer um loop for e usarcomm
:man comm
:Outras ferramentas úteis para usar em conjuntos de strings e tabelas são
tr
,sort
euniq
para preparar dados ejoin
,cut
epaste
para fazer algumas operações triviais. Essas ferramentas são mais simples que universaissed
,grep
eawk
, sem falar emperl
epython
.