![Bash는 텍스트 HHMMSS를 HH:MM:SS로 변환합니다.](https://linux55.com/image/213082/Bash%EB%8A%94%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20HHMMSS%EB%A5%BC%20HH%3AMM%3ASS%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4..png)
타임스탬프(첫 번째 열)가 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
...첫 번째 필드는 다음과 같이 time
Miller()를 사용하여 변환될 수 있습니다 .NNNNNN
NN:NN:NN
mlr
$ 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
은 "그 자리에서" 편집됩니다.