2017-02-11 55 views
1

您好我有一個CSV文件,像這樣:AWK保留頁眉在輸出

order,account,product 
23023,Best Buy,productA 
20342,Best Buy,productB 
20392,Wal-Mart,productC 

我使用這個解決方案從以前的線程:

awk -F ',' '{ print > ("split-" $2 ".csv") }' dataset1.csv 

但是輸出端產生2個文件沒有標題:

文件1

23023,Best Buy,productA 
20342,Best Buy,productB 

文件2

20392,Wal-Mart,productC 

如何可以修改AWK溶液上方以保留標題行中的每個分割文件,以便在輸出類似:

文件1

order,account,product 
23023,Best Buy,productA 
20342,Best Buy,productB 

文件2

order,account,product 
20392,Wal-Mart,productC 

非常感謝!

回答

0

您可以使用此awk腳本:

script.awk

NR == 1 { header = $0; next} 
     { fname = "split-" $2 ".csv" 
     if(!($2 in mem)) { 
      print header > fname 
      mem[ $2 ] = 1 
     } 
     print > fname 
     } 

你使用這樣的:awk -F, -f script.awk dataset1.csv

說明

  • header在閱讀腳本
  • 另一數據線的第一行中的數據文件的第一數據線存儲,劇本寫headerfname,但只在第一次寫入fname
  • 這是通過存儲$2mem
+0

不適用於我,我在Best Buy文件中爲每行獲取標題。在哪裏定義了not()函數?或者你是否只想'如果(!(在內存中$ 2))'? –

+0

@glennjackman是的我的意思是'''謝謝。 –

+0

'mem [$ 2] = 1'不是必需的,'mem [$ 2]'沒有賦值就足夠了,因爲你正在檢查數組中的鍵,而不是數組值。 – karakfa

1

實現我會寫這樣的:

awk -F, ' 
    NR == 1 { header = $0; next} 
    !($2 in files) { 
     files[$2] = "split-" $2 ".csv" 
     print header > files[$2] 
    } 
    { print > files[$2] } 
' dataset1.csv 
+0

謝謝,這工作得很好! – brandon

0

另一個類似awk

awk -F, 'NR==1 {h=$0; next} 
       {file="split-" $2 ".csv"; 
       print (a[file]++?"":h ORS) $0 > file}' input 

a[file]++是由輸出文件名索引的行計數器,僅插入第一行之前與ORS所附的標題,這將成爲爲每個分割文件中的標題。

+0

感謝您的解決方案,這也非常好! – brandon