如果列不同,则获取csv中的所有重复记录

时间:2017-07-27 09:44:23

标签: bash shell unix

我有一个csv文件,它有列式数据,比如

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,

我尝试使用

首先在另一个文件中删除除3之外的其他列
UPDATE orders o SET o.name = 
   IFNULL((SELECT CONCAT(u.first_name, ' ', u.last_name) AS full_name 
           FROM users u 
           WHERE u.user_id = o.user_id 
           AND u.first_name IS NOT NULL 
           AND u.first_name <> ''), 'NONE');

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

由于我不完全了解awk,所以我无法做到这一点

2 个答案:

答案 0 :(得分: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行被视为重复,即使它不是。

答案 1 :(得分:0)

我通过首先切割可能不同的第3列然后运行awk '++A[$0]==2' file命令来做同样的事情。谢谢你的帮助