从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并删除重复的列的方式,而不必告诉它哪些列删除我上面的手动方法。谢谢!
答
试试这个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
输入只是一个标准的perfmon csv日志文件,只是其中一列出于某种奇怪的原因而重复出现,我需要删除du但请保留原文。我更新了一个粗略的输出示例... – user2000718 2013-04-06 19:06:12
“1”,“1”,“1”,“1”,“1”'应该发生什么?只留下一个值?是否应该保留逗号?你的问题很不明确。 – Jens 2013-04-06 20:04:04
对不起,我想你可能会误读它,我正在删除csv文件中的重复列。 – user2000718 2013-04-06 20:24:21