我有以下数据。为了简单起见,我在这里只给出了 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нιη 几乎相同。当保存服务器名称时,我使用一个BEGIN
块来写入标头和清空该行的分配。$0 = ""
awk -F"[= ']" -vOFS=, 'BEGIN {print "Hostname", "Variable", "Value"} $5~/^server[0-9]+$/ && h=$5 {$0 = ""} $0!~/^$/ {print h, $1, $5}' data