AWK コマンドの結果を新しい CSV ファイルに書き込みます。

AWK コマンドの結果を新しい CSV ファイルに書き込みます。

次のテキストを含む完全なファイルのリストがあります。

Sun Aug 22 19:00:00 2021
        User-Name = "407359687"
        Acct-Status-Type = Interim-Update
        Acct-Output-Octets = 3263901190
        Acct-Session-Id = "PPP3092201SSG0001006b0a55AABODS"
        Acct-Session-Time = 1146851
        Acct-Output-Gigawords = 15
        Event-Timestamp = "Aug 22 2021 18:55:32 +08"
        Timestamp = 1629630000

私の目標は、重要な行をインポートして新しいCSVファイルに保存することです。以下のAWKコマンドを使用してテキストの値を並べ替えていますが、CSVファイルに書き込む方法がわかりません。

awk '{if ($1 == "User-Name")
    {start=1; wholeLine=""; wholeLine = wholeLine$3;}
    if ($1$2$3 =="Acct-Status-Type=Interim-Update"||$1$2$3 =="Acct-Status-Type=Stop")
    {wholeLine=wholeLine","$3;}
    else if ($1$2$3 =="Acct-Status-Type=Start")
    {start=0;wholeLine=""}
    if (($1=="Acct-Output-Octets")&&(start==1))
    {wholeLine=wholeLine","$3;}
    if (($1=="Acct-Session-Id")&&(start==1))
    {wholeLine=wholeLine","$3;}
    if (($1=="Acct-Session-Time")&&(start==1))
    {wholeLine=wholeLine","$3;}
    if (($1=="Acct-Output-Gigawords")&&(start==1)) 
    {wholeLine=wholeLine","$3;} 
    if (($1=="Event-Timestamp")&&(start==1))
    {timeStamp="";timeStamp=$3" "$4" "$5" "$6" "$7;wholeLine=wholeLine","timeStamp}
    if (($1=="Timestamp")&&(start==1))
    {wholeLine=wholeLine","$3;}
    if (($1=="")&&(start==1))
    {start=0;print wholeLine}}' /home/file/detail-20210822

私の予想CVS結果は次のようになります。

"405947674",Interim-Update,1079493624,"PPP3082110SSG000100be4a72AAAk5Y",25440,0,"Aug 22 2021 19:00:43 +08",1629630315

ベストアンサー1

各レコードの8つのフィールドが常に正しい順序で存在し、CSVファイルで有効にするために追加の処理が必要ないと仮定します(つまり、追加の引用やエスケープは必要ありません)。

sed -n 's/^[^=]*= //p' file | paste -d , - - - - - - - -

これにより、等号の後にスペースが続く行(または部分= 文字列に行の最初の等号が含まれていない行)が含まれていない行が削除され、最初の等号の後と空白の前のすべてのテキストが削除されます。

pasteその後、残りのデータのカンマ区切り8列を作成します。

サンプルデータを含むファイルに対して2つのテストを実行します。

$ sed -n -e 's/^[^=]*= //p' file | paste -d , - - - - - - - -
"407359687",Interim-Update,3263901190,"PPP3092201SSG0001006b0a55AABODS",1146851,15,"Aug 22 2021 18:55:32 +08",1629630000
"407359687",Interim-Update,3263901190,"PPP3092201SSG0001006b0a55AABODS",1146851,15,"Aug 22 2021 18:55:32 +08",1629630000

Start2番目の列のすべての行は、結果をパイピングして削除できます(元のデータの一部をフィルタリングするため)。Acct-Status-Type = Start

awk -F , '$2 != "Start"'

おすすめ記事