Este awk
deve fazê-lo:
awk '{
if ( $NF ~ /[0-9]+:[0-9]+:[0-9]+/ ) {
lasttime = $NF
print
} else {
print $0, lasttime
}
}' < myfile.txt
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?
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
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[@]}
.
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
Tags text-processing awk sed