Verificar e adicionar timestamps ausentes a linhas individuais em um arquivo

4

Eu tenho um arquivo no seguinte formato:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213
ABCD ASADSADSFSSDSSD 09:24:50

Basicamente, exceto o primeiro campo, todos os outros campos são diferentes.

Requisito: desejo o registro de data e hora em cada linha. Se um registro de data e hora estiver faltando em qualquer linha, quero anexar o registro de data e hora da linha anterior ao final da linha ausente (Exemplo da linha 4 acima). Como posso conseguir isso?

    
por stany 07.07.2013 / 01:13

3 respostas

4

Este awk deve fazê-lo:

awk '{ 
         if ( $NF ~ /[0-9]+:[0-9]+:[0-9]+/ ) {
            lasttime = $NF
            print
         } else {
            print $0, lasttime
         }
     }' < myfile.txt
    
por 07.07.2013 / 01:37
2

Aqui está uma solução bash caso isso seja importante. Ele faz uso de um único awk , mas isso provavelmente poderia ser refatorado se necessário:

while read line ; do
  ncol=$(echo "$line" | awk '{print $NF}')
  if [[ "$ncol" == *:*:* ]]; then
    tmstmp="$ncol"
    echo "$line"
    continue
  fi
  echo "$line $tmstmp"

done < 82031.txt

O arquivo 82031.txt inclui o seguinte:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213
ABCD ASADSADSFSSDSSD 09:24:50

A execução do script acima produz o seguinte:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213 09:24:42
ABCD ASADSADSFSSDSSD 09:24:50

solução pura de Bash

Aqui está uma alternativa que não usa nada além de Bash. Em vez de usar awk para extrair a última coluna de uma linha de entrada do arquivo .txt, estamos usando o comando read do Bash no loop while . As opções -ra desativam as barras invertidas de serem um caractere de escape ( -r ) e -a dividem a entrada usando o separador $IFS , colocando cada átomo de texto em um elemento na matriz ${line[@]} . / p>

while IFS=" " read -ra line ; do
  ncol="${line[@]: -1:1}"
  if [[ "$ncol" == *:*:* ]]; then
    tmstmp="$ncol"
    echo "${line[@]}"
    continue
  fi
  echo "${line[@]} $tmstmp"

done < 82031.txt

Este bit, ${line[@]: -1:1} extrai a última coluna da matriz ${line[@]} .

    
por 07.07.2013 / 02:30
0

Mais uma solução bash

[[ ! -f $1 ]] && { echo -e "\tUsage:\t\n\t\t$0\t<input_file>\n"; exit 1; }

while read -ra line;
do
        if [[ ${line[@]} =~ [0-9]+:[0-9]+:[0-9]+ ]]; then
                echo ${line[@]}
                lasttime=${line[@]: -1:1}
        else

                echo ${line[@]} $lasttime
        fi
done < $1
    
por 07.07.2013 / 10:31