Usando o awk para processar um arquivo de mapeamento com um número dinâmico de colunas

3

Eu estou querendo saber como processar informações da seguinte forma:

mapping.txt :

80  001 002
81  011 012 013 014
82  021 022
...

input.txt :

81  103823044
80  103823054
81  103823064
...

Desejado output.txt :

103823044|011|
103823044|012|
103823044|013|
103823044|014|
103823054|001|
103823054|002|
103823064|011|
103823064|012|
103823064|013|
103823064|014|

Eu fiz um mapeamento simples em que os números das colunas são fixos, mas não tenho certeza de como mapear um número dinâmico de colunas para a saída desejada

    
por K - 17.06.2015 / 18:06

1 resposta

1

Você pode tentar seguir:

awk 'NR == FNR { x[$1,$2] = $1; next; } { for (i in x) { if (x[i] == $1) { split(i,t,SUBSEP); for (z = 2; z <= NF; z++) { print t[2] "|" $z "|"; } } } }' input.txt mapping.txt

O primeiro bloco é executado durante a leitura do arquivo input.txt . É alcançado pela condição NR == FNR que é true enquanto o primeiro arquivo é lido. No primeiro bloco, criamos uma matriz x com chaves da primeira e segunda coluna e valores da primeira coluna. O segundo bloco é executado para o arquivo mapping.txt devido a next no primeiro bloco. No segundo bloco verificamos todas as chaves no array x se o valor da coluna 1 existe como valor no array x , e se existe extrai a segunda parte da chave com split e imprimimos em um loop este valor e valores da segunda coluna até a última coluna ( NF - número de campos no registro atual).

    
por 17.06.2015 / 18:13

Tags