2013-04-06 132 views
1

我已經將perfmon輸出到csv,我需要刪除任何重複的列,例如從csv文件刪除重複的列

COL1,col2的,COL3,COL1,COL4,COL5

當列重複它幾乎總是同列,但它不會發生的每一次。我已經走到這一步,有一對夫婦的手動步驟:

當列計數大於它應該是我輸出的所有單線條的列標題:

head -n1 < output.csv|sed 's/,/\n/g' 

然後,當我知道哪些列數是有罪的,我手動刪除,例如:

cut -d"," --complement -f5,11 <output.csv> output2.csv 

如果有人能在正確的方向指向我,我會很感激!

更新給予的output.csv內容粗糙的例子,應該是熟悉的人誰是使用性能監視器:

"COLUMN1","Column2","Column3","COLUMN1","Column4"  
"1","1","1","1","1" 
"a","b","c","a","d" 
"x","dd","ffd","x","ef" 

我需要刪除重複COLUMN1(第4列)

只是要清楚,我試圖想一種自動進入output.csv並刪除重複的列的方式,而不必告訴它哪些列刪除我上面的​​手動方法。謝謝!

+0

輸入只是一個標準的perfmon csv日誌文件,只是其中一列出於某種奇怪的原因而重複出現,我需要刪除du但請保留原文。我更新了一個粗略的輸出示例... – user2000718 2013-04-06 19:06:12

+0

「1」,「1」,「1」,「1」,「1」'應該發生什麼?只留下一個值?是否應該保留逗號?你的問題很不明確。 – Jens 2013-04-06 20:04:04

+0

對不起,我想你可能會誤讀它,我正在刪除csv文件中的重複列。 – user2000718 2013-04-06 20:24:21

回答

2

試試這個awk(不是真正的單行),它處理多個重複的列,它只檢查標題(第一行)以決定哪些列被重複。你的例子也以這種方式顯示。

awk腳本(一個班輪版):

awk -F, 'NR==1{for(i=1;i<=NF;i++)if(!($i in v)){ v[$i];t[i]}}{s=""; for(i=1;i<=NF;i++)if(i in t)s=s sprintf("%s,",$i);if(s){sub(/,$/,"",s);print s}} ' file 

清晰版(同一個腳本):

awk -F, 'NR==1{ 
     for(i=1;i<=NF;i++) 
       if(!($i in v)){v[$i];t[i]} 
     } 
     {s="" 
     for(i=1;i<=NF;i++) 
       if(i in t) 
         s=s sprintf("%s,",$i) 
         if(s){ 
           sub(/,$/,"",s) 
           print s 
         } 
     } ' file 

與例子(注意我創建了兩個重複的cols):

kent$ cat file 
COL1,COL2,COL3,COL1,COL4,COL2 
1,2,3,1,4,2 
a1,a2,a3,a1,a4,a2 
b1,b2,b3,b1,b4,b2 
d1,d2,d3,d1,d4,d2 


kent$ awk -F, 'NR==1{ 
     for(i=1;i<=NF;i++) 
       if(!($i in v)){v[$i];t[i]} 
     } 
     {s="" 
     for(i=1;i<=NF;i++) 
       if(i in t) 
         s=s sprintf("%s,",$i) 
         if(s){ 
           sub(/,$/,"",s) 
           print s 
         } 
     } ' file 
COL1,COL2,COL3,COL4 
1,2,3,4 
a1,a2,a3,a4 
b1,b2,b3,b4 
d1,d2,d3,d4 
+0

完美!非常感謝... – user2000718 2013-04-06 20:24:52