次のテキストを含む完全なファイルのリストがあります。
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
Start
2番目の列のすべての行は、結果をパイピングして削除できます(元のデータの一部をフィルタリングするため)。Acct-Status-Type = Start
awk -F , '$2 != "Start"'