Bash는 텍스트 HHMMSS를 HH:MM:SS로 변환합니다.

Bash는 텍스트 HHMMSS를 HH:MM:SS로 변환합니다.

타임스탬프(첫 번째 열)가 HHMMSS 형식인 csv 로그 파일을 읽고 있습니다. 여기서 HH는 시간(0-23), MM은 분(0-59), SS는 두 번째(0-59)입니다. .

파일을 읽고 열 데이터에 대해 다양한 변환을 수행하여 타임스탬프가 변수(예: CURRTYME)에 포함되도록 했습니다. 내 현재 변환은 다음과 같습니다

# Data will have leading zeros and will always be 6 characters
CURRTYME="073031"
NEXTTYME=`echo $CURRTYME | sed 's/./&:/2'`
LASTTYME=`echo $NEXTTYME| sed 's/./&:/5'`
echo $LASTTYME

이것이 삽입을 수행하는 가장 좋은 방법입니까, 아니면 하나의 sed 문에서 수행할 수 있습니까?

답변1

#!/bin/bash

CURTIME="073031"

echo $CURTIME | sed "s|\(..\)\(..\)\(..\)|\1:\2:\3|"
echo $CURTIME | cut -c-2,3-4,5- --output-delimiter=:

echo ${CURTIME:0:2}:${CURTIME:2:2}:${CURTIME:4:2}

마지막 항목은 필수 항목입니다 bash.

아니면 갈 수도 있지만 awk그렇게 작은 일을 하기엔 너무 과한 것 같아요

답변2

CSV 파일의 제목이 다음과 같다고 가정합니다.

time,data A,data B
123456,abba,baab
654321,quux,uxqu

...첫 번째 필드는 다음과 같이 timeMiller()를 사용하여 변환될 수 있습니다 .NNNNNNNN:NN:NNmlr

$ mlr --csv put -S '$time = sub($time,"(..)(..)(..)","\1:\2:\3")' file
time,data A,data B
12:34:56,abba,baab
65:43:21,quux,uxqu

이는 데이터를 CSV로 읽고 바꾸기 명령( sub())을 사용하여 명명된 필드를 time파일의 각 레코드에 필요한 형식으로 변환합니다.

교체는 time필드의 처음 6자를 각각 2자로 구성된 세 그룹으로 일치시키고 그룹 사이에 콜론을 삽입합니다. 하위 명령 -S의 옵션은 put필드 유형을 추론하지 않으므로 이를 숫자 대신 문자열로 처리할 수 있습니다.

옵션이 주어지면 -I파일 mlr은 "그 자리에서" 편집됩니다.

관련 정보