2014-03-13 49 views
2

我需要記錄100個以上的CSV文件,只要這些文件的格式包括示例數據即可。我希望做的是採取CSV格式如下:AWK:將CSV與標題轉換爲彙總表

Name, Phone, State 
Fred, 1234567, TX 
John, 2345678, NC 

並將其轉換爲:

Field | Sample 
--- | ---- 
Name | Fred 
Phone | 1234567 
State | TX 

這可能與AWK?從我下面的示例中,您會看到我正在嘗試將格式設置爲降價表格。我已經是目前換位與

#!/usr/bin/awk -v RS='\r\n' -f 
BEGIN { printf "| Field \t| Critical |\n"} 
{ 
    printf "|---\t|---\t|\n" 
    for (i=1; i<=NF; i++) {print "|", toupper($i), "| sample |"} 
} 
END {} 

標題行,但我不知道現在如何使用數據的第一行,標題後顯示樣本數據?

+0

你能產出至少給兩個樣本? – BMW

回答

1

awk是數據解析的正確工具。您可以嘗試類似:

awk ' 
BEGIN { FS=", "; OFS=" | " } 
NR==1 { 
    for(tag = 1; tag <= NF; tag++) { 
     hdr[tag] = sprintf ("%-7s", $tag) 
    } 
    next 
} 
{ 
    for(fld = 1; fld <= NF; fld++) { 
     data[NR,fld] = $fld 
    } 
} 
END { 
    print "Field | Sample\n------- | -------"; 
    for(rec = 2; rec <= NR; rec++) { 
     for(line = 1; line <= NF; line++) { 
      print hdr[line], data[rec,line] 
     } 
    } 
}' file 

輸出

Field | Sample 
------- | ------- 
Name | Fred 
Phone | 1234567 
State | TX 
Name | John 
Phone | 2345678 
State | NC 
+1

現貨,非常感謝!這正是我所追求的。我喜歡互聯網和所有分享他們知識的人!謝謝。 – user1519769

+1

由於您使用'tag'值只有一個循環,您可以用'while(tag ++ Jotne

+0

@Jotne事實上,隨着更多明確的版本。 –

1

這裏有一個更簡單的方法與awk
無需存儲陣列中的一切都做到這一點,然後在最後打印。

awk -F", " 'NR==1{split($0,a,FS);print "Field | Sample\n------- | -------";next} {for (i=1;i<=NF;i++) printf "%-8s| %s\n",a[i],$i}' file 
Field | Sample 
------- | ------- 
Name | Fred 
Phone | 1234567 
State | TX 
Name | John 
Phone | 2345678 
State | NC 

工作原理:

awk -F", " '       # set field separator to "," 
NR==1{         # if first line do: 
    split($0,a,FS)      # split first line to an array named "a" to get the labels 
    print "Field | Sample"   # print header 
    print "------- | -------"   # print separator 
    next}        # prevents nothing more run for first line 
    {         # for all lines except first do: 
    for (i=1;i<=NF;i++)     # loop trough all element in line 
     printf "%-8s| %s\n",a[i],$i  # print data for every element 
    } 
' file 
+0

適用於較短版本。 –