Como duplicar cada linha usando comandos shell?

1

Eu tenho um monte de dados como abaixo.

1,A9600,001_DIF,NA,TIME,startTime    
2,A9600,002_DEP,NA,TIME,startTime
3,A9600,003_LIT,NA,TIME,startTime
4,A9600,004_ETC,NA,TIME,startTime
5,B9600,005_CMP,NA,TIME,startTime
6,B9600,006_IMP,NA,TIME,startTime
7,B9600,007_DIF,NA,TIME,startTime

e eu quero que eles sejam modificados como abaixo.

1,A9600,001_DIF,NA,TIME,startTime
1,A9600_1,001_DIF,NA,TIME,startTime
1,A9600_2,001_DIF,NA,TIME,startTime
1,A9600_3,001_DIF,NA,TIME,startTime  
2,A9600,002_DEP,NA,TIME,startTime
2,A9600_1,002_DEP,NA,TIME,startTime
2,A9600_2,002_DEP,NA,TIME,startTime
2,A9600_3,002_DEP,NA,TIME,startTime
....

Como conseguir isso usando comandos shell?

    
por sclee1 16.05.2017 / 09:58

3 respostas

0

Um simples loop de awk

awk -v num=3 'BEGIN {OFS=FS=","} 
  {tmp=$2; print; for (i=1;i<=num;i++) {$2=tmp"_"i; print}}
  ' file

Ajuste num conforme desejado.

    
por 16.05.2017 / 13:33
0

Então, essencialmente, você quer repetir cada linha quatro vezes com sufixos diferentes depois do segundo campo?

sed 'p;s/,/_1,/2p;s/_1/_2/p;s/_2/_3/' file

Isso é p para imprimir a linha como está; o primeiro comando s adiciona _1 antes da segunda vírgula e imprime; o segundo e terceiro s substitui por _2 e _3 , o segundo usa o p para imprimir a linha, enquanto a última versão é impressa por padrão.

Editar após a pergunta expandida

Se você quiser fazer um loop para um determinado número de iterações, você pode fazer

sed 'p;s/,/_1,/2p;G;s/$/0123456789+/;:a
s/\(_[0-9]*\)\([0-9]\)\(,.*\n.*\)\(.\)//
s/_+/_10/;s/\(_[0-9]*\)\([0-9]\)+\(.*\n.*\)\(.\)//
/_+/!P
/_123,/! ta
d' file

em que 123 na linha seguinte à última é o índice máximo. No momento não tenho tempo para explicar, mas posso fazer isso mais tarde se você quiser entender o que está acontecendo.

    
por 16.05.2017 / 10:02
0
perl -pse '$l = $_;
   for my $k ( 1 .. $N ) { s/\z/$l =~ s|^[^,]+,[^,]+\K|_$k|r/e }
' -- -N=3 -- Input.data

Trabalhando

  • A opção -p configura um arquivo implícito como leitura em loop + autoprint de registros.
  • -s permite que variáveis sejam configuradas a partir de linhas de comando, no nosso caso $N . YMMV.
  • Salve o registro atual em $ l.
  • Fazemos um loop e anexamos ao registro atual o conteúdo de $ l modificado no local onde a segunda vírgula é encontrada.
por 16.05.2017 / 15:08