Usando o SED para unir dois campos no CSV e adicioná-los ao final da linha

1

Eu tenho um problema de SED além do meu conhecimento. Eu tenho uma usina solar que gera arquivos CSV no formato

2012-01-08;00:00;171,297;0,000;    
2012-01-08;00:05;171,297;0,000;
2012-01-08;00:10;171,297;0,000;
2012-01-08;00:15;171,297;0,000;
2012-01-08;00:20;171,297;0,000;
2012-01-08;00:25;171,297;0,000;

Estou importando esses valores em um banco de dados MySQL. Eu gostaria de ter uma combinação dos dois primeiros valores para atuar como uma chave primária exclusiva.

O resultado deve ser parecido com:

2012-01-08;00:00;171,297;0,000;2012-01-08-00:00
2012-01-08;00:05;171,297;0,000;2012-01-08-00:05
2012-01-08;00:10;171,297;0,000;2012-01-08-00:10
2012-01-08;00:15;171,297;0,000;2012-01-08-00:15
2012-01-08;00:20;171,297;0,000;2012-01-08-00:20
    
por Roel 08.01.2012 / 21:39

3 respostas

3

Eu usaria awk para isso, não sed :

awk -F';' ' NF {print $0 $1"-"$2}'

Onde:

  • -F';' : define o separador do campo de entrada
  • NF : é o número de campos usados aqui para filtrar linhas sem campos
  • $0 : é toda a linha
  • $1 e $2 : são o primeiro e o segundo campos
  • O resto, eu acho, é autoexplicativo.

Demo:

% echo '2012-01-08;00:00;171,297;0,000;

2012-01-08;00:05;171,297;0,000;

2012-01-08;00:10;171,297;0,000;

2012-01-08;00:15;171,297;0,000;

2012-01-08;00:20;171,297;0,000;

2012-01-08;00:25;171,297;0,000;' | awk -F';' ' NF {print $0 $1"-"$2}'
2012-01-08;00:00;171,297;0,000;2012-01-08-00:00
2012-01-08;00:05;171,297;0,000;2012-01-08-00:05
2012-01-08;00:10;171,297;0,000;2012-01-08-00:10
2012-01-08;00:15;171,297;0,000;2012-01-08-00:15
2012-01-08;00:20;171,297;0,000;2012-01-08-00:20
2012-01-08;00:25;171,297;0,000;2012-01-08-00:25
    
por 08.01.2012 / 21:49
2

Uma maneira de usar sed :

sed 's/\(\([^;]*;\)\{2\}\)\(.*\)// ; s/;$// ; s/\(.*\);/-/' infile

Explicação:

s/\(\([^;]*;\)\{2\}\)\(.*\)//     # Match content until second ';' and copy it at the end of the 
                                        # line.
s/;$//                                  # Delete last ';'
s/\(.*\);/-/                          # Substitute last ';' with '-'

Resultado:

2012-01-08;00:00;00:00;2012-01-08-00:00
2012-01-08;00:05;00:05;2012-01-08-00:05
2012-01-08;00:10;00:10;2012-01-08-00:10
2012-01-08;00:15;00:15;2012-01-08-00:15
2012-01-08;00:20;00:20;2012-01-08-00:20
2012-01-08;00:25;00:25;2012-01-08-00:25
    
por 08.01.2012 / 22:10
0

Isso pode funcionar para você:

 sed 'h;s/;.*//;H;g;s/\s*\n//' file
    
por 26.01.2012 / 16:55

Tags