0

我使用的数据供应商有一个错误,并且需要很长时间才能修复它。

这是我从他们那里收到的 csv 文件的简化版本:

# cat new_data20130904.csv
a,001,b,c,d
e,002,f,g,h
e,003,f,g,h
i,004,j,k,l

第 2 行和第 3 行的第 2 列是唯一的,但数据相同。

供应商不应该创建第 3 行,供应商已确认该错误并承诺修复,但我预计不会很快。

我需要解析和修改 CSV 文件,使其变为:

a,001,b,c,d
e,002,f,g,h
i,004,j,k,l

我想编写一些防御性代码来删除这些错误重复的行。

理想情况下,我想使用 Ubuntu/Debian 内置程序。

最初,我认为删除第二个字段并运行 uniq 将是一个好的开始:

# cut -d, -f1,3- new_data20130904.csv | uniq
a,b,c,d
e,f,g,h
i,j,k,l

但是现在我想不出一种将第二列重新添加回来的方法,所以我认为这不会有帮助。

4

2 回答 2

1

那这个呢?

$ awk -F, '{if (a[$1]) next}a[$1]=$0' file
a,001,b,c,d
e,002,f,g,h
i,004,j,k,l

解释

我们将第一列存储在一个数组中。如果它已经在数组中,我们跳过记录。

  • -F,将字段分隔符设置为逗号,
  • {if (a[$1]) next}如果第一个字段已经在数组中,请跳过。
  • a[$1]=$0将第一个字段保存为数组的键a并打印该行(print $0是 awk 的默认行为,因此不需要编写)。

如果它是需要忽略的第 n 列,我将如何调整它?

您可以替换a[$1]for a[$n]n列在哪里。

于 2013-09-04T10:37:46.283 回答
0

如果您希望在比较重复条目时基于除一列之外的所有列,只需在每个循环中将其删除并重新评估 $0,同时将 $0 保存到之前的另一个值。

awk -F, -v i=2 '{t=$0;$i=""}!a[$0]++{print t}' file

wherei设置为要忽略的列数。

In !a[$0]++,$0已经是一个重新评估的表格,其中$i已经是空的,并且它将密钥存储在a. 如果尚未存储,则该值应为初始值0!并将导致它被否定为1. ++重新评估后会增加它。如果最初看到它,它将是0(否定到1),它将导致执行下一个命令,即打印该行。在重复的条目中,它已经增加了并且会否定回0不允许执行下一个命令。

于 2013-09-04T12:15:29.070 回答