필드를 구문 분석하고 n번째 필드의 형식을 변경하는 스크립트

필드를 구문 분석하고 n번째 필드의 형식을 변경하는 스크립트

여러 필드가 포함된 파이프로 구분된 텍스트 파일의 내용을 가져오려고 합니다. 필드 10은 yyyy-MM-dd hh:mm:ss또는 형식의 타임스탬프입니다 yyyy-MM-dd hh:mm:ss.SSS. 전자인 경우 .'000'필드 끝에 a를 추가하고 싶습니다. 그렇지 않으면 이를 유지하고 다른 필드는 변경하지 않고 그대로 두고 싶습니다.

현재 를 사용하려고 하는데 awk작동하는 것 같지만 솔루션이 약간 느낌이 듭니다.병동 :-)

awk 'BEGIN {FS=OFS="|"}
{for(i=1;i<9;i++) printf "%s|",$i; printf "%s|",$9}
{printf($10 ~ /\./) ? substr($10,1,10)" "substr($10,12)"|" : substr($10,1,10)" "substr($10,12,18)".000|"}
{for(i=11;i<NF;i++) printf "%s|",$i; printf "%s\n",$NF}'

정리를 위해 제가 할 수 있는 일이 있나요?

답변1

이것을 "한 줄"로 줄이는 것이 가능해야 합니다. 실제로 필요한 것은 밀리초가 없는 타임스탬프가 발견되면 필드 10을 수정하는 규칙과 일반적인 경우(규칙 1로 인한 가능한 수정 포함) 전체 OK를 단순히 "인쇄"하는 규칙입니다. 따라서 다음과 같이 가정합니다 GNU Awk.

awk -F'|' -v OFS='|' '$10 ~ /^[[:digit:]]{4}(-[[:digit:]]{2}){2} ([[:digit:]]{2}:){2}[[:digit:]]{2}$/ {$10=$10".000"} {print}' textfile

그러면 문제가 해결될 것입니다.

대부분의 경우 위 정규식은 타임스탬프를 확인하는 데 있어 너무 "완전"합니다. 파일 형식을 충분히 신뢰한다면 필드 10에 대한 확인을 다음으로 줄일 수 있습니다.

awk -F'|' -v OFS='|' '$10 ~ /:[0-5][0-9]$/ {$10=$10".000"} {print}'

또한 더 이상 GNU 버전이 필요하지 않습니다 awk.

테스트 입력에 적용

a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33|m|n|o
a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33.123|m|n|o

생산하다:

~$ awk -F'|' -v OFS='|' '$10 ~ /:[0-5][0-9]$/ {$10=$10".000"} {print}' testinput

a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33.000|m|n|o
a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33.123|m|n|o

답변2

10번째 필드를 변경하면 됩니다.

awk 'BEGIN { FS=OFS="|" }
     NF>9 && $10 !~ /\.[0-9][0-9][0-9]$/ {  $10 = $10".000" }
     {print}'

더 짧은 솔루션을 얻으려면 다음 {print}으로 바꿀 수 있습니다 . 작은따옴표 안의 개행은 선택 사항입니다.1

관련 정보