como substituir o primeiro elemento em um CSV com um número seqüencial?

4

Eu tenho um arquivo csv como este:

5/05/2017;03;07;30;35;43;01;03
9/05/2017;08;12;16;22;26;06;07
12/05/2017;02;20;28;29;44;03;09
16/05/2017;08;11;15;20;30;03;08
19/05/2017;09;11;12;19;30;04;09
23/05/2017;08;15;25;27;42;01;04
26/05/2017;05;07;26;36;39;02;10
...

isto é, uma data, mais uma série de números seguidos por ; .

Eu preciso remover essa data na primeira posição com um número em seqüência começando com 1004 ... assim:

1004;03;07;30;35;43;01;03
1005;08;12;16;22;26;06;07
1006;02;20;28;29;44;03;09
1007;08;11;15;20;30;03;08
1008;09;11;12;19;30;04;09
1009;08;15;25;27;42;01;04
1010;05;07;26;36;39;02;10
...

Eu posso remover a data usando isto:

cut -f 2-8 -d';' 2.txt | xargs -I{}

mas como adiciono um número em seqüência substituindo a data?

    
por SpaceDog 07.11.2017 / 13:08

3 respostas

9
Solução

awk :

awk -F';' 'BEGIN{ i=1004 }{ $1=i++ }1' OFS=';' file
  • -F';' - separador de campo de entrada

  • i=1004 - iniciando incremento

A saída:

1004;03;07;30;35;43;01;03
1005;08;12;16;22;26;06;07
1006;02;20;28;29;44;03;09
1007;08;11;15;20;30;03;08
1008;09;11;12;19;30;04;09
1009;08;15;25;27;42;01;04
1010;05;07;26;36;39;02;10

Ou você pode passar a variável i de "fora":

awk -F';' '{ $1=i++ }1' i=1004 OFS=';' file
    
por 07.11.2017 / 13:22
6
  • com awk :

    awk -v cnt=1004 '{ sub("^[^;]+", cnt++) } 1' file.csv
    
  • Com shell:

    cnt=1004
    while read -r line; do
        printf '%d;%s\n' $cnt "${line#*;}"
        let cnt++
    done <file.csv
    
  • Com jot , paste e um shell que pode manipular <(...) de redirecionamentos:

    paste -d\; <(jot $(wc -l <file.csv) 1004) <(cut -d\; -f2- file.csv)
    
  • Com o Vim:

    :let cnt=1004 | g/^/ s/^[^;]\+/\=cnt/ | let cnt+=1
    
  • com o Perl:

    perl -F\; -lpe 'BEGIN{ $cnt=1004 } $F[0]=$cnt++; $_=join ";", @F' file.csv
    
por 07.11.2017 / 13:17
2

Use o Python, é fácil de ler, entender e manter - e está disponível na maioria das instalações do Unix:

python - << "EOF" > outfilename
for index, line in enumerate(open("filename"), start=1004):
    linedata = line.strip().split(';')
    linedata[0] = str(index)
    print(';'.join(linedata))
EOF
    
por 07.11.2017 / 17:57

Tags