Ajuda com iteração de campoA no arquivo CSV, onde o campoB especificou o valor

3

Estou tentando configurar um script para ser executado no gitbash, para processar um arquivo CSV, de modo que cada registro que tenha um valor específico, o último campo seja alterado de vazio ( "" ) para um valor iterativo de 1 para 16. Além disso, o valor de atualização é prefixado por algum texto.

O campo deve ser parecido com REP0001 , acabar como REP0100 e, em seguida, começar novamente em REP0001 , para cada registro no arquivo CSV correspondente.

Veja uma amostra do texto de entrada:

"00:30:00","01:00:00","10/14/2014","RETURN","PASADENA","TX","12:30:00","sedan","","","corporate","CO01353"
"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal",""

O exemplo da primeira linha, não quero alterar, mas ainda incluí-lo na saída. O exemplo da segunda linha, eu quero mudar o último campo de "" para um valor que começa com REP0001 e itera para REP0100 , então começa em REP0001 .

Veja uma amostra do texto desejado:


"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal","REP0001"

Eu tentei sed , bem como awk , mas não sou profissional em scripts. Eu consegui unir a parte que encontra os registros com o valor desejado e insiro o valor desejado. Mas eu não sei como fazer a mágica da iteração:


awk 'BEGIN{FS=",";OFS=","} $4 ~ /"RENT OUT"/ {$12="2""REP0001""2"}1' Rentals.csv  > output

Alguém pode me indicar a direção certa para fazer isso? O arquivo em si tem cerca de 2000 linhas.

    
por Manny Lornu 23.10.2014 / 03:00

2 respostas

3

Eu acredito que isso faz o que você quer:

$ awk 'BEGIN{FS=",";OFS=","} $4 ~ /"RENT OUT"/ {NF--;printf $0; x=x%100;x++; printf ",\"REP%04i\"\n",x;next} 1' rentals.csv 
"00:30:00","01:00:00","10/14/2014","RETURN","PASADENA","TX","12:30:00","sedan","","","corporate","CO01353"
"01:00:00","01:30:00","10/14/2014","RENT OUT","HOUSTON","TX","00:30:00","sedan","","","personal","REP0001"

A única parte que é alterada é este comando:

$4 ~ /"RENT OUT"/ {NF--;printf $0; x=x%100;x++; printf ",\"REP%04i\"\n",x;next}

Tomando cada nova peça uma de cada vez:

  • NF--

    Isso remove o último campo (em branco) da linha.

  • 'printf $ 0

    Isto imprime a linha (agora sem seu último campo).

  • x=x%100;x++

    Isso leva o contador x módulo 100 e, em seguida, incrementa-o em 1. Dessa forma, o contador passará de 1 a 100 e volta a 1.

  • printf ",\"REP%04i\"\n",x

    Isso imprime nosso novo último campo que inclui o contador.

  • next

    Como já imprimimos essa linha, informamos awk para pular o restante dos comandos e começar de novo com a linha next .

por 23.10.2014 / 03:25
1

Outra versão (um pouco mais compacta) com sprintf :

awk 'BEGIN{FS=OFS=","} $4 ~ /"RENT OUT"/ {$12=sprintf("\"REP%04i\"",++i);i=i%100}1'
    
por 23.10.2014 / 05:41