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