次のデータがあります。簡単にするために、ここでは2つのサーバーのみを表示します。このサーバーのリストは、変数の値と同様に随時変更されることがあります。
hostname = 'server1'
var1 = 'abc'
var2 = 'xyz'
var3 = 'def'
hostname = 'server7'
var1 = 'ghi'
var2 = 'mno'
var3 = 'jkl'
csv形式で送信できますか?
出力.csv
Hostname Variable Value
server1 var1 abc
server1 var2 xyz
server1 var3 def
server7 var1 ghi
server7 var2 mno
server7 var3 jkl
現在手動で値をコピーしてMs Excelに貼り付けています。このプロセスを自動化したいのですが、まだ実装についてはわかりません。
いくつかのアイデアやサンプルコードを共有していただきありがとうございます。
答え1
使用awk
:
awk -F"[=' ]" -v OFS=, '
$1=="hostname"{ hn=$5; next }
!hdr && hn { print "Hostname", "Variable", "Value"; hdr=1 }
NF && hn { print hn, $1, $5 }' infile >output.csv
の場合、および空白文字をフィールド区切り文字として定義する-F"[=' ]"
ため、awkはこれらの区切り文字に基づいて行をフィールドに分割します。=
'
を使用すると、OFS=,
出力はカンマ区切りのフィールドに生成され、単純なcsvファイルを生成し、必要に応じてそれを別の文字に変更します。
答え2
使用ミラーそして走っている
<input.txt sed "s/'//g" | mlr --x2c --ips "=" clean-whitespace then reshape -r "var" -o variable,value
あなたはやる
hostname,variable,value
server1,var1,abc
server1,var2,xyz
server1,var3,def
server7,var1,ghi
server7,var2,mno
server7,var3,jkl
フィールド値の先頭と末尾にのみ存在し、大文字のフィールド名を必要とする単一引用符も削除したい場合:
mlr --x2c --ips = clean-whitespace then reshape -r '^var' -o Variable,Value then put 'for (k,v in $*) { $[k]=sub(v,"^'\''(.*)'\''$","\1") }' then label Hostname input.txt
答え3
答えは@αГsнιmetとほぼ同じです。サーバー名を保存するときは、BEGIN
ブロックを使用してヘッダーを書き込み、行の割り当てを消去します。$0 = ""
awk -F"[= ']" -vOFS=, 'BEGIN {print "Hostname", "Variable", "Value"} $5~/^server[0-9]+$/ && h=$5 {$0 = ""} $0!~/^$/ {print h, $1, $5}' data