1

我已经将 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 并删除重复列的方法,而不必告诉它要删除哪些列,就像我上面的手动方法一样。谢谢!

4

1 回答 1

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
于 2013-04-06T20:06:28.293 回答