파일에는 |로 구분된 키와 값 쌍이 있습니다. 입력 및 출력에 표시된 대로 키 쌍의 공백을 제거해 달라는 요청이 있습니다. 예: 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)|
위의 내용에서는 어떤 필드도 포함할 수 없으며 |
각 행이 로 시작한다고 가정합니다 |
.