从csv文件中删除重复的列

时间:2013-04-06 18:48:55

标签: shell csv awk

我已经将perfmon输出到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内容的粗略示例,对于使用perfmon的任何人都应该很熟悉:

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

我需要删除重复的COLUMN1(第4列)

为了清楚起见,我正在尝试一种自动进入output.csv并删除重复列的方法,而不必告诉它删除哪些列上面的手动方法。谢谢!

1 个答案:

答案 0 :(得分:3)

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