두 구분 기호 사이의 공백을 자르는 방법 - Unix

두 구분 기호 사이의 공백을 자르는 방법 - Unix

파일에는 |로 구분된 키와 값 쌍이 있습니다. 입력 및 출력에 표시된 대로 키 쌍의 공백을 제거해 달라는 요청이 있습니다. 예: UTC 시간 오프셋 -> UTCTimeOffset

다른 sed 및 awk 명령을 시도했지만 올바른 명령을 얻을 수 없습니다

입력하다:

LogID = AMQ11111.0.FDC|Date/Time = Wed April 14 2021 03:19:43 EET|UTC Time = 1618334334.03|UTC Time Offset = 660 (EFT)|

산출:

LogID = AMQ11111.0.FDC|Date/Time = Wed April 14 2021 03:19:43 EET|UTCTime = 1618334334.03|UTCTimeOffset = 660 (EFT)|

답변1

키나 값에 내장된 |또는 =문자가 포함되어 있지 않다고 가정합니다.

awk 'BEGIN { ORS = RS = "|"; OFS = FS = " =" }{ gsub(" ", "", $1) }; NF > 1' file

이는 입력을 -로 구분된 레코드 집합으로 처리합니다 |. 각 레코드는 =(공백 + =)를 필드 구분자로 사용합니다.

각 기록에 대해 첫 번째 필드(키)의 공백이 제거됩니다 gsub(). 현재 레코드에 필드가 두 개 이상 있으면 인쇄합니다(마지막에 빈 레코드가 출력되지 않도록 하기 위한 테스트입니다).

출력 끝에 개행 문자가 없습니다.

불행하게도 AIX에서는 테스트할 수 없지만 비표준 awk기능을 사용하는 것 같지는 않습니다.

답변2

모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.

$ cat tst.awk
BEGIN { FS=OFS="|" }
{
    for (i=1; i<NF; i++) {
        key = val = $i
        sub(/ *=.*/,"",key)
        sub(/[^=]*= */,"",val)
        gsub(/ /,"",key)
        $i = key " = " val
    }
    print
}

$ awk -f tst.awk file
LogID = AMQ11111.0.FDC|Date/Time = Wed April 14 2021 03:19:43 EET|UTCTime = 1618334334.03|UTCTimeOffset = 660 (EFT)|

위의 내용에서는 어떤 필드도 포함할 수 없으며 |각 행이 로 시작한다고 가정합니다 |.

관련 정보