Se eu entendi o que você está tentando fazer, você deseja adicionar as linhas no arquivo $ADD
ao arquivo $TARGET
, mas sem adicionar linhas que já existem?
Acho que pode haver maneiras mais fáceis do que o grepping repetido. comm
pode fornecer as linhas que existem apenas no primeiro, no segundo ou nos dois arquivos, vamos usar isso:
comm -23 <(sort "$ADD") <(sort "$TARGET") > tmp ; cat tmp >> "$TARGET"
O argumento -23
significa que não mostram linhas presentes apenas no arquivo 2, e não mostram linhas presentes em ambos (3). As entradas precisam ser classificadas e eu estou fazendo o acréscimo por meio de um arquivo temporário apenas para estar no lado seguro.
Uma solução de força bruta com sort
e uniq
também pode funcionar ...
cat "$ADD" "$TARGET" | sort | uniq > tmp ; mv tmp "$TARGET"
Isso, é claro, classificará o arquivo resultante (e removerá todas as linhas duplicadas existentes anteriormente).
(É claro que você pode querer criar um nome único de arquivo temporário .)
Quanto ao código atual, acho que o condicional em fgrep
está invertido, pois grep
retorna 0 se uma correspondência for encontrada e, diferentemente da maioria dos ambientes de programação, zero atua como true em shell scripts. Também something | while read ...
deve funcionar da mesma forma que while... < <(something)
, mas pode ser mais fácil de ler.