como cortar uma data para o formato de 00/00/0000?

0

Eu quero preencher e substituir a data já extraída em um arquivo .csv de 0/0/0000 a 00/00/0000, por exemplo, 1/9/2016 - > 01/09/2016

Eu tenho esse script

sed 's/\/1\//\/01\//g; s/\/2\//\/02\//g; s/\/3\//\/03\//g; s/\/4\//\/04\//g; s/\/5\//\/05\//g; s/\/6\//\/06\//g; s/\/7\//\/07\//g; s/\/8\//\/08\//g; s/\/9\//\/09\//g' file_name.csv > file_name2.csv
sed 's/,1\//,01\//g; s/,2\//,02\//g; s/,3\//,03\//g; s/,4\//,04\//g; s/,5\//,05\//g; s/,6\//,06\//g; s/,7\//,07\//g; s/,8\//,08\//g; s/,9\//,09\//g' file_name2.csv > file_name3.csv 
    
por Daniel 08.07.2016 / 20:37

2 respostas

4

Esta declaração sed irá adicionar um 0 aos dois primeiros números se eles tiverem dígitos únicos:

sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0!'        

por exemplo,

$ cat x
1/1/1970
10/1/2000
10/10/2100

$ sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0!' x
01/01/1970
10/01/2000
10/10/2100
    
por 08.07.2016 / 20:49
0

Na verdade, é simples apenas se você faz muitas suposições. Como a pergunta não forneceu um exemplo, aqui estão algumas suposições realistas:

  • o delimitador entre os campos da data é /
  • os arquivos csv têm mais de uma coluna
  • a data pode estar em qualquer coluna
  • outras colunas podem ter números

O exemplo de Stephen não abordou os três últimos. Aqui está um script mostrando duas melhorias:

#!/bin/sh
INPUT=foo.csv
echo GIVEN
cat $INPUT
echo BEFORE
sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0!' <$INPUT
echo IMPROVED
sed     \
        -e 's,^\([0-9][/]\),0,' \
        -e 's,\([,/]\)\([0-9]\),000,g' \
        -e 's,^0*\([0-9]\{2\}[/]\),,' \
        -e 's,\([,/]\)0*\([0-9]\{2\}\),,g' \
        <$INPUT
echo BETTER
sed     \
        -e 's,^\([0-9][/]\),0,' \
        -e 's,\([,/]\)\([0-9]\),000,g' \
        -e 's,^0*\([0-9]\{2\}[/]\),,' \
        -e 's!0*\([0-9]\{2\}\)\([,/]\)0*\([0-9]\{2\}\)\([/]\)0*\([0-9]\{4,\}\)!!g' \
        <$INPUT

e saída da execução do script:

GIVEN
1/1/1970
10/1/2000
10/10/2100
first,1/1/1970
second,10/1/2000
third,10/10/2100
9term,1/1/1
BEFORE
01/01/1970
10/01/2000
10/10/2100
first,1/01/1970
second,10/01/2000
third,10/10/2100
9term,1/01/1
IMPROVED
01/01/1970
10/01/2000
10/10/2100
first,01/01/1970
second,10/01/2000
third,10/10/2100
9term,01/01/01
BETTER
01/01/1970
10/01/2000
10/10/2100
first,01/01/1970
second,10/01/2000
third,10/10/2100
9term,01/01/0001

Uma solução completa levaria em conta melhor os limites (como desconto de itens como 1/1/1text ) e aspas (arquivos csv usam aspas duplas para trabalhar com vírgulas dentro de colunas).

    
por 16.07.2016 / 13:49