【问题标题】:Get all the duplicates record in a csv if a column is different如果列不同,则获取 csv 中的所有重复记录
【发布时间】:2017-07-27 09:44:22
【问题描述】:

我有一个 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 没有完整的了解,所以我无法做到

【问题讨论】:

  • 看看comm "Common - 逐行比较两个排序的文件并写入标准输出:常见的行加上唯一的行。"
  • 无法通过 comm 命令解决
  • @ggupta EvtsUpdated,IR23488700,7273867,ESTIMATED 不重复。为什么它仍然是输出的一部分?
  • 什么是column 3 你的意思是零索引吗?
  • @k-5 不是,索引为 0,在上面的数据中它是倒数第二列

标签: bash shell unix


【解决方案1】:

您可以使用 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 的行被视为重复,即使它不是。

【讨论】:

  • 我已经给出了数据样本,它们可能是多列,所以我认为逐列会更加困难。
【解决方案2】:

我做了同样的事情,首先剪切可能不同的第三列,然后运行awk '++A[$0]==2' file 命令。感谢您的帮助

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2019-07-06
    • 2016-03-23
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多