AWK - Gerando SN de intervalos e adicionando-o para gravar

1

Considerando o seguinte arquivo de entrada delimitado por vírgulas:

1,13/06/17,01,03,D151
2,25/06/17,04,06,D154

Usando os campos 3rd e 4th de cada registro, preciso gerar números de série com os mesmos outros campos do registro ao qual o SN pertence.

para o primeiro registro (03 - 01 = 2+1) Esse número de novos registros

para o 2º registro (06 - 04 = 2+1) Esse número de novos registros

Saída:

1,13/06/17,01,03,D151
1,13/06/17,01,03,D151,1
1,13/06/17,01,03,D151,2
1,13/06/17,01,03,D151,3
2,25/06/17,04,06,D154
2,25/06/17,04,06,D154,4
2,25/06/17,04,06,D154,5
2,25/06/17,04,06,D154,6

O simples uso de for posso gerar os SNs, mas vinculá-los ao registro original é o problema aqui.

    
por Eng7 04.07.2017 / 15:21

2 respostas

4

Algo como:

awk -F, '{print; for (i = 0+$3; i <= $4; i++) print $0 FS i}'
    
por 04.07.2017 / 15:25
1
while IFS= read -r l; do
   printf '%s\n' "$l" | tee log
   for i in $(seq $(cut -d, -f3,4 log | tr , '\n')); do
     printf '%s,%s\n' "$l" "$i"
   done
done < input.csv

perl -F, -pe 's|(.*)\K|join $/, $,, map "$1,$_", 0+$F[2]..$F[3]|ex'  input.csv

saída:

1,13/06/17,01,03,D151
1,13/06/17,01,03,D151,1
1,13/06/17,01,03,D151,2
1,13/06/17,01,03,D151,3
2,25/06/17,04,06,D154
2,25/06/17,04,06,D154,4
2,25/06/17,04,06,D154,5
2,25/06/17,04,06,D154,6

Explicação

  1. Linha atual salva em $1 . O \n no registro atual não será salvo em $ 1, pois o . não corresponde a uma nova linha, a menos que o modificador /s esteja em vigor.
  2. $F[2]..$F[3] = > gerar uma seqüência de números começando da esquerda terminando com a direita, em etapas de 1. O artefato 0+ está lá para remover os zeros à esquerda que de outra forma resultariam.
  3. map executará a operação apropriada combinando a linha atual e o inteiro separados por uma vírgula.
  4. Todas essas sequências geradas na Etapa 3 são unidas pelo $/ , que é o RS e padroniza para uma nova linha.
por 04.07.2017 / 18:05