2つの区切り記号の間のスペースを切り取る方法 - Unix

2つの区切り記号の間のスペースを切り取る方法 - 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)|

上記では、どのフィールドも含めることができず、|各行がで始まると仮定します|

関連情報