2017-07-27 72 views
0

我有一个CSV文件,其中有逐列数据,如获取所有的重复记录在CSV列是否不同

EvtsUpdated,IR23488670,15920221,ESTIMATED 
EvtsUpdated,IR23488676,11014018,ESTIMATED 
EvtsUpdated,IR23488700,7273867,ESTIMATED 
EvtsUpdated,IR23486360,7273881,ESTIMATED 
EvtsUpdated,IR23488670,7273807,ESTIMATED 
EvtsUpdated,IR23488670,9738420,ESTIMATED 
EvtsUpdated,IR23488670,7273845,ESTIMATED 
EvtsUpdated,IR23488676,12149463,ESTIMATED 

,我只是想找出所有重复的行忽略列,这是第3列的输出应该像

EvtsUpdated,IR23488670,15920221,ESTIMATED 
EvtsUpdated,IR23488676,11014018,ESTIMATED 
EvtsUpdated,IR23488700,7273867,ESTIMATED 
EvtsUpdated,IR23488670,7273807,ESTIMATED 
EvtsUpdated,IR23488670,9738420,ESTIMATED 
EvtsUpdated,IR23488670,7273845,ESTIMATED 
EvtsUpdated,IR23488676,12149463,ESTIMATED 

我通过首先使用切割其它列除外3在另一个文件中尝试过

cut --complement -f 3 -d, filename into another file, 

然后我尝试使用awk命令,如awk -F'{if(FNR == NR){print}}'secondfile

因为我没有awk的完整知识,所以我不是能够做到这一点

+0

看看[通讯](https://ss64.com/bash/comm.html)“通用 - 比较两个排序文件一行一行地写到标准输出: 属于线共同的,加上独特的线条。“ – DanieleO

+0

无法解决从COMM COMMAND – ggupta

+0

@ggupta'EvtsUpdated,IR23488700,7273867,ESTIMATED'不重复。为什么它仍然是输出的一部分? –

回答

0

您可以使用awk数组来存储每组列的数量以识别重复项。

awk -F "," '{row[$1$2$4]++ ; rec[$0","NR] = $1$2$4 } 
END{ for (key in rec) { if (row[rec[key]] > 1) { print key } } }' filename | sort -t',' -k5 | cut -f1-4 -d',' 

另外一个sort被要求保持原来的排序预计在你的输出。

注意:在显示的输出中,IR23488700的行被认为是重复的,即使它不是。

+0

我已经给定的数据样本,它们可以是多列所以服用逐列将更加困难,我认为。 – ggupta

0

我也是这样做的,先切割第三列,然后运行awk '++A[$0]==2' file命令。感谢您的帮助