Melhor maneira de incrementar números em uma linha no Linux [closed]

1

Eu tenho uma linha com muitas entradas entre as quais também é hora.

 ('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...

Eu gostaria de incrementar cada vez por algumas horas. no formato de 24 h. Por exemplo, 10:30:00 se tornaria 15:30:00 .

Qual é a melhor ferramenta universal para este trabalho? Eu estou pensando em termos de:

  1. utilitários do sistema, como awk , sed .. & o que mais eu não sei

  2. vim

  3. linguagens de script como bash ou python '

Qual seria a maneira canônica de fazer isso?

    
por Arkonix 23.05.2015 / 02:15

2 respostas

0

Só para esclarecer:

vim é um utilitário do sistema (um editor de texto) na maioria dos sistemas * nix. awk , sed e bash são linguagens (ou ferramentas, dependendo do contexto) que você pode usar para analisar e alterar o texto.

O que você precisa para aumentar o tempo e com que frequência você precisará incrementá-lo? Esses fatores em quais ferramentas você vai querer usar. Em qualquer caso, este é um esforço de múltiplas partes, ASSUMINDO ISTO NÃO É SQL:

  1. Primeiro você está combinando sequências parciais em uma string. Você pode usar awk , sed ou grep -e , com uma regex, para extrair essas substrings.

  2. Quando você tiver esses valores, os converterá em números inteiros (ou, se estiver usando um idioma mais completo, como o python, poderá convertê-los em valores de data e hora usando uma biblioteca). Você terá que fazer as contas necessárias (e validação, se aplicável) para alterar esses valores.

  3. Por fim, você adicionará os valores substituídos à linha e salvará o arquivo alterado.

Honestamente, porém, isso parece com sql , por isso pode ser muito mais fácil usar as ferramentas internas nessa linguagem para alterar esses valores.

    
por 23.05.2015 / 03:51
0

Existem algumas boas dicas em esta resposta sugerindo um caminho de menor resistência usando um script linguagem como Perl, Python, Ruby, etc., que permite a mistura de operações matemáticas e de correspondência.

Aqui está um rápido hack com Perl:

$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
    's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$

Neste exemplo simplista, a classe de caracteres dígitos ( \d ) seguida do indicador de repetição (por exemplo, {2} ) é usada para capturar componentes posicionais da data e fazemos cegamente aritmética no campo hora. Esse tipo de solução só é apropriado quando você conhece seus dados bem o suficiente para garantir que a aritmética simplista no campo de horas não faça com que o dia seja transferido.

Revisitando este problema para corrigir a aritmética de data / hora correta quando o campo de horas estourar conforme solicitado pelo @Lieven, o módulo de núcleo Perl Time::Piece (Perl > 5.8) pode ser usado:

$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
    perl -MTime::Piece -pe \
        's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
            Time::Piece->strptime($1, "%Y-%m-%d %T") \
            + (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$

Esta entrada de exemplo foi atualizada para mostrar o tratamento adequado dos valores de horas que passam para o dia seguinte. Ele puxa o módulo Time::Piece na linha de comando, combina a data e a hora da entrada, converte para Time::Piece objetos para executar a aritmética de data / hora e depois volta para o formato de saída desejado.

    
por 23.05.2015 / 09:25