在文件中,我们有由 | 分隔的键和值对,我的请求是删除键对中的空格,如输入和输出中所示。示例: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 机器上的任何 shell 中使用任何 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)|
上面假设您的任何字段都不能包含|
并且每行以|
.