Verifique o arquivo de destino para entrada duplicada antes de copiar dados do arquivo de origem [duplicado]

2

Estou tentando copiar linhas de source.txt para target.txt . Eu gostaria que este script bash verificasse cada linha em target.txt se houvesse entrada duplicada antes da cópia.

source.txt contains:

a$$a$$a
b**b**
c%%cc%%
d##d##d##
e^^e^^e^^

target.txt contains:

a$$a$$a
ee$$ee$$
ff__ff__
gg@@gg@@
zzxxzzxx
bb..bb..bb
e^^e^^e^^
hh;;hh;;hh

neste cenário, presumo que apenas 3 entradas serão copiadas para target.txt , que são:

b**b**
c%%cc%%
d##d##d##

Meu código de teste é:

#!/bin/bash
echo "started"
programpath=/home/mysite/www/copyfiles

var str input ; cat "$programpath/source.txt" > $input 
var str target ; cat "$programpath/target.txt" > $target 

cat $input >> $target

uniq -u "$target"

echo "finished"
    exit 1
fi
    
por danone 15.10.2017 / 05:59

1 resposta

1

Por que usar bash ? O comando grep pode limpar o trabalho.

grep -Fxvf target.txt source.txt #>> target.txt

Isto irá retornar as linhas que existem somente em source.txt , então você pode anexar estas linhas ao seu target.txt apenas com o descompasso #>> target.txt .

Você também pode precisar do source.txt antes, para evitar acrescentar entradas duplicadas se no arquivo source.txt , o qual awk também faz o mesmo na próxima .

grep -Fxvf target.txt <(sort -u source.txt) #>> target.txt
  • A opção -F informa a grep que corresponde ao padrão como uma string em vez de regex.
  • Com a opção -x , estamos dizendo que linha inteira é meu padrão.
  • O -v é a correspondência inversa que, se você errar, produzirá as linhas que existem nos dois arquivos.
  • E -f está informando grep ler meus padrões de um arquivo que é target.txt aqui.

Ou você pode usar awk .

awk 'NR==FNR{seen[$0]=1;next} !seen[$0]++' target.txt source.txt #>> target.txt
  • Adicione todo o arquivo target.txt na matriz chamada seen com a chave da linha inteira seen[$0] e faça next para ler a próxima linha.

  • Com !seen[$0]++ , estamos procurando uma linha de source.txt que não existe na matriz e, em seguida, imprima-a. Além disso, inclua linhas de arquivos source.txt na matriz para evitar a impressão de linhas duplicadas, se existirem no source.txt_.

por 15.10.2017 / 06:11