Bash가 변수 값을 csv로 보내나요?

Bash가 변수 값을 csv로 보내나요?

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

관련 정보