Algo como:
awk -F, '{print; for (i = 0+$3; i <= $4; i++) print $0 FS i}'
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.
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
$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. $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. map
executará a operação apropriada combinando a linha atual e o inteiro separados por uma vírgula. $/
, que é o RS
e padroniza para uma nova linha. Tags text-processing awk