Como comparar 2 arquivos e saída do conteúdo desejado para o terceiro arquivo

0

Eu tenho 2 arquivos de entrada.

Conteúdo do arquivo 1 como ( file1 ):

"BRGTEST-242" a.txt
"BRGTEST-240" a.txt
"BRGTEST-219" e.txt

Conteúdo do arquivo 2 como ( file2 ):

"BRGTEST-244" a.txt
"BRGTEST-244" b.txt
"BRGTEST-231" c.txt
"BRGTEST-231" d.txt
"BRGTEST-221" e.txt

Eu quero obter a saída final como ( file3 ):

BRGTEST-244 is depdendent on BRGTEST-242 for file a.txt    
BRGTEST-244 is depdendent on BRGTEST-240 for file a.txt    
BRGTEST-221 is dependent on BRGTEST-219 for the file e.txt 

Como escrever a lógica do script de shell para isso? Eu tentei usar awk , mas não consegui os resultados desejados.

    
por Chai 15.07.2018 / 03:33

2 respostas

3

Com o GNU Awk (gawk), que suporta matrizes multidimensionais, a lógica parece ser:

gawk '
  NR==FNR {
    a[$2][++c[$2]] = $1; next
  } 
  $2 in a {
    for (i in a[$2]) 
      print $1 " is dependent on " a[$2][i] " for " $2
  }
' File1 File2
"BRGTEST-244" is dependent on "BRGTEST-242" for a.txt
"BRGTEST-244" is dependent on "BRGTEST-240" for a.txt
"BRGTEST-221" is dependent on "BRGTEST-219" for e.txt

Se você precisar remover as aspas também:

gawk '
  NR==FNR {
    a[$2][++c[$2]] = substr($1,2,length($1)-2); next
  } 
  $2 in a {
    for (i in a[$2]) 
      print substr($1,2,length($1)-2) " is dependent on " a[$2][i] " for " $2
  }
' File1 File2
BRGTEST-244 is dependent on BRGTEST-242 for a.txt
BRGTEST-244 is dependent on BRGTEST-240 for a.txt
BRGTEST-221 is dependent on BRGTEST-219 for e.txt
    
por 15.07.2018 / 04:12
1

Isso faz o que você quer:

#!/bin/bash

while read line1; do
  f21=$(echo $line1 | cut -d" " -f1)
  f22=$(echo $line1 | cut -d" " -f2)
  #echo "outside: $f21 -- $f22"

  while read line2; do
    f11=$(echo $line2 | cut -d" " -f1)
    f12=$(echo $line2 | cut -d" " -f2)
    #echo "inside: $f11 -- $f12"

    if [ "$f22" == "$f12" ]; then
      echo "$f21 is dependent on $f11 for file $f22"
    fi

  done < file1
done < file2

Exemplo

./parsy.bash
"BRGTEST-244" is dependent on "BRGTEST-242" for file a.txt
"BRGTEST-244" is dependent on "BRGTEST-240" for file a.txt
"BRGTEST-221" is dependent on "BRGTEST-219" for file e.txt

Como funciona

Eu deixei neste script 2 echo ... comandos que você pode remover o comentário para ver visualmente como este script está percorrendo os outros 2 arquivos. Quando você descomente, verá esta saída:

$ ./parsy.bash | head -10
outside: "BRGTEST-244" -- a.txt
inside: "BRGTEST-242" -- a.txt
"BRGTEST-244" is dependent on "BRGTEST-242" for file a.txt
inside: "BRGTEST-240" -- a.txt
"BRGTEST-244" is dependent on "BRGTEST-240" for file a.txt
inside: "BRGTEST-219" -- e.txt
outside: "BRGTEST-244" -- b.txt
inside: "BRGTEST-242" -- a.txt
inside: "BRGTEST-240" -- a.txt
inside: "BRGTEST-219" -- e.txt

A chave para fazer isso é reconhecer que você precisa percorrer o conteúdo de file2 e ver se cada elemento corresponde com base nas condições de file1 . Para fazer isso, você precisa aninhar um loop dentro de outro loop.

Depois que você tiver essa estrutura e os dados analisados de acordo, uma simples declaração if poderá ser usada para determinar se a segunda coluna de file1 e file2 é uma correspondência, se assim for, echo do mensagem usando as peças que coletamos.

    
por 15.07.2018 / 04:08