다음 데이터가 있습니다. 단순화를 위해 여기에는 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