从csv文件删除重复的列

问题描述:

我已经将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

试试这个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