[英]Convert key:value to CSV file
我找到了以下 bash 腳本,用於將帶有鍵值信息的文件轉換為 CSV 文件:
awk -F ":" -v OFS="," '
BEGIN { print "category","recommenderSubtype", "resource", "matchesPattern", "resource", "value" }
function printline() {
print data["category"], data["recommenderSubtype"], data["resource"], data["matchesPattern"], data["resource"], data["value"]
}
{data[$1] = $2}
NF == 0 {printline(); delete data}
END {printline()}
' file.yaml
但是執行之后,它只轉換了第一組數據(只有前6行數據),像這樣
category,recommenderSubtype,resource,matchesPattern,resource,value
COST,CHANGE_MACHINE_TYPE,instance-1,f1-micro,instance-1,g1-small
我的原始文件是這樣的(有 1000 行及更多):
category:COST
recommenderSubtype:CHANGE_MACHINE_TYPE
resource:portal-1
matchesPattern:f1-micro
resource:portal-1
value:g1-small
category:PERFORMANCE
recommenderSubtype:CHANGE_MACHINE_TYPE
resource:old-3
matchesPattern:n1-standard-4
resource:old-3
value:n1-highmem-2
我缺少任何命令嗎?
原始腳本的問題是這些行:
NF == 0 {printline(); delete data}
END {printline()}
第一行表示:如果當前行沒有記錄,則調用 printline()。 第二行表示在處理完所有數據后調用printline()
。
輸入數據格式的難點在於它並不能很好地指示下一條記錄何時到 output。 在下文中,我簡單地將腳本更改為 output 每六條記錄的數據。 如果可能有重復的鍵,output 的標准可能是“所有字段填充”或需要稍微不同的編程。
#!/bin/sh -e
awk -F ":" -v OFS="," '
BEGIN {
records_in = 0
print "category","recommenderSubtype", "resource", "matchesPattern", "resource", "value"
}
{
data[$1] = $2
records_in++
if(records_in == 6) {
records_in = 0;
print data["category"], data["recommenderSubtype"], data["resource"], data["matchesPattern"], data["resource"], data["value"]
}
}
' file.yaml
其他表揚
delete
語句,因為我不確定它的作用。 awk
的 POSIX 規范僅將其定義為刪除單個數組元素。 如果應該刪除整個數組,建議對元素進行循環。 但是,如果所有字段始終存在,那么也可以完全消除它。awk
rather than bash
because AWK is really the scripting language used in this question with bash
only being responsible for calling awk
with suitable parameters:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.