Combina linhas de arquivos diferentes, se o padrão for correspondido

0

Entrada: dois arquivos delimitados por tabulação, File1 e File2 . File2 ( $2 ) deve ser analisado pelos padrões encontrados em File1 ( $1 ).

Saída esperada: arquivo delimitado por tabulação, File3 . File3 precisa conter as mesmas linhas que File2 , mais o valor correspondente em File1 se o padrão for correspondido (fim da linha, separado por tabulação).

Arquivo1 (delimitado por tabulação):

ABC1    1    3
ABC2    4    3
ABC3    3    2
ABC4    3    3

Arquivo2 (delimitado por tabulação):

text1   ABC1-AB   text2   text3
text2   ABC2-AB   text1   
text3   ABC1-CD   text2
text4   ABC5-AB   text3   text4

Arquivo3:

text1   ABC1-AB   text2   text3    1    3
text2   ABC2-AB   text1    4    3
text3   ABC1-CD   text2    1    3
text4   ABC5-AB   text3   text4
    
por dovah 27.10.2015 / 17:50

2 respostas

2

com awk :

awk 'FNR==NR{a[$1]=$2"\t"$3} FNR!=NR{split($2,b,"-"); $0=$0"\t"a[b[1]];print}' file1 file2
  • FNR==NR aplica-se ao primeiro arquivo file1 :
    • a[$1]=$2"\t"$3 preenche a matriz a com o 2º e 3º campo e como índice usa o 1º campo.
  • FNR!=NR aplica-se ao segundo arquivo file2 :
    • split($2,b,"-") divide o segundo campo em - .
    • $0=$0"\t"a[b[1]] acrescenta os dois valores à linha.
    • print imprime a linha.

A saída:

text1   ABC1-AB text2   text3   1   3
text2   ABC2-AB text1   4   3
text3   ABC1-CD text2   1   3
text4   ABC5-AB text3   text4
    
por 27.10.2015 / 18:42
2

Testado usando BASH.

while read LINEFILE2
do
  printf "$LINEFILE2" >> File3
  while read LINEFILE1
  do
    read PATTERN ADDITIONS <<EOF
$LINEFILE1
EOF
    [ ! -z "$PATTERN" ] && [ ! -z $(echo "$LINEFILE2" | cut -f2 | grep "$PATTERN") ] && {
      printf "\t$ADDITIONS\n" >> File3
    }
  done < File1
done < File2

Se você quiser que o padrão seja encontrado dentro da linha inteira e não apenas na coluna 2, você pode obter o comando cut da construção do duto.

    
por 27.10.2015 / 22:42