Referencia cruzada de cada campo de uma linha com uma coluna em outro arquivo

0

Não tenho experiência com awk, sed, grep e etc. Tentar colocar uma frase na minha pergunta faz com que pareça mais confuso do que deveria, por isso começarei com um exemplo do que estou tentando alcançar.

input1

A B C D  
A B C  
A B C D E F  

input2

v A  
c B  
c C  
c D  
v E  

output

A B C D  
v c c c  
A B C  
v c c  
A B C D E F  
v c c c v Ø

então basicamente eu tenho 2 arquivos de entrada.

input1 , onde cada linha tem um número diferente de campos.
input2 , onde cada linha possui 2 campos.

Eu preciso de um output em que para cada linha em input1 primeiro será impressa a linha completa com todos os seus campos e, em seguida, para a linha seguinte de output , ele procurará o conteúdo de cada campo dessa linha de input1 no segundo campo de input2 . Em seguida, imprima o primeiro campo dessa linha em input2 ou um Ø caso o conteúdo não seja encontrado em input2 . Repita isso até o último campo, imprimindo os resultados em uma única linha. Em seguida, faça o mesmo para cada linha em input1 .

Como eu vou estar fazendo tarefas um pouco diferentes como essa, uma breve explicação do que cada parte dos comandos faz seria muito apreciada. Agradecemos antecipadamente.

    
por z3itg3istc4tchup 12.09.2017 / 21:05

2 respostas

0
$ awk 'FNR == NR {   a[$2] = $1; next }
                 {   print
                     line = (a[$1] ? a[$1] : "Ø")
                     for (i = 2; i <= NF; ++i) {
                        line = line OFS (a[$i] ? a[$i] : "Ø")
                     }
                     printf("%s\n", line)
                 }' input2 input1
A B C D
v c c c
A B C
v c c
A B C D E F
v c c c v Ø

Ou seja, se estivermos lendo o primeiro arquivo ( input2 ), preencha uma tabela de consulta com os símbolos com os quais cada caractere deve ser substituído.

Ao ler o segundo arquivo ( input1 ), imprima a linha de entrada, faça um loop pelos campos e construa uma cadeia com os símbolos corretos da tabela de consulta. Se um símbolo estiver faltando na tabela de consulta, insira Ø .

Em seguida, imprima a string montada com uma nova linha final.

Você também pode transformá-lo em um script adequado:

#!/usr/bin/awk -f

FNR == NR {   a[$2] = $1; next }
          {   print
              line = (a[$1] ? a[$1] : "Ø")
              for (i = 2; i <= NF; ++i) {
                  line = line OFS (a[$i] ? a[$i] : "Ø")
               }
                     printf("%s\n", line)
          }

Em seguida, torne-o executável ( chmod +x script ) e execute-o da seguinte maneira:

$ ./script input2 input1
A B C D
v c c c
A B C
v c c
A B C D E F
v c c c v Ø
    
por 12.09.2017 / 21:19
0

Isso parece funcionar:

awk 'NR==FNR { code[$2]=$1 } NR!=FNR {print; for( i=0; i<=NF; i++) { printf( "%s ", code[$i] ) }; printf "\n" }' input2 input1

O bloco NR==FNR é executado apenas no primeiro arquivo especificado (em que o número de registros processados no total é igual ao número total geral até o momento) e preenche uma matriz usada posteriormente para a saída.

O bloco NR!=FNR é executado somente no arquivo subseqüente e primeiro exibe a linha de entrada fornecida e, em seguida, percorre o valor e usa cada valor como o subscrito de uma pesquisa de matriz para determinar se deve gerar v ou% código%.

Após esta série iterada, uma nova linha é enviada.

    
por 12.09.2017 / 21:16