Tentando usar a saída de diff para comparar para um arquivo separado

1

Eu tenho dois arquivos:

smw:/working/iso_testing # cat a
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm
test.rpm

AND

smw:/working/iso_testing # cat b
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm

- Se eu diferenciá-los, vejo isso:

smw:/working/iso_testing # diff a b
4d3
< test.rpm

Eu quero pegar essa saída (test.rpm) e tirá-la de um terceiro arquivo. A.K.A. arquivo c:

smw:/working/iso_testing # cat c
QConvergeConsoleCLI QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica acpica-20140724-2.1.2.i586.rpm
test test.rpm

Meu resultado desejado seria algo como

test test.rpm

Talvez eu tenha muitos arquivos para começar, mas estou preso. Agradecemos antecipadamente

O arquivo A é a lista ou o rpm de um repositório, o arquivo B é uma lista de rpm de um arquivo .csv e o arquivo C é uma cópia do arquivo B, mas com nomes de pacotes, não apenas o rpm. ***

    
por Jeff Edlund 17.10.2017 / 22:07

1 resposta

0

Aqui está a solução TLDR:

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

Segue uma explicação mais detalhada.

Provavelmente, a primeira coisa que você desejará fazer é limpar a saída do comando diff e extrair as sequências que deseja procurar.

Com base no seu exemplo, parece que você deseja as linhas que só ocorrem no primeiro arquivo (por exemplo, arquivo "a").

O comando a seguir retorna as linhas do primeiro arquivo e remove o prefixo "<":

diff <(diff a b | sed -n 's/^< //p')

Agora você pode fazer um loop sobre esse diff e grep limpos para cada linha, por exemplo:

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

Essa abordagem tem a vantagem de ser bastante flexível, pois você pode substituir a instrução grep por um comando arbitrário.

Por outro lado, se você souber que apenas deseja procurar por essas sequências fixas, também poderá usar o sinalizador -f para grep em vez de usar um loop for:

grep -f <(diff a b | sed -n 's/^< //p') c

Outra alternativa é invocar diff uma segunda vez:

diff <(diff a b | sed -n 's/^< //p') c

Você pode processar essa saída de maneira semelhante:

diff <(diff a b | sed -n 's/^< //p') c | sed -n 's/^< //p'
    
por 17.10.2017 / 23:27

Tags