簡體   English   中英

將 key:value 轉換為 CSV 文件

[英]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 規范僅將其定義為刪除單個數組元素。 如果應該刪除整個數組,建議對元素進行循環。 但是,如果所有字段始終存在,那么也可以完全消除它。
  • 歡迎來到 SO(我也是新來的)。 Next time you are asking, I would recommend tagging the question 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM