我有一个包含大量电影数据的大文件,包括每部电影的唯一ID。虽然每行上的每个ID都是唯一的,但有些行包含重复的电影数据。
例如:
INSERT
在这种情况下,我想完全删除ID,movie_title,year
1,toy story,1995
2,jumanji,1995
[...]
6676,toy story,1995
6677,jumanji,1995
和6677,toy story,1995
行。这不仅仅发生在一部电影中,所以我不能做一个简单的查找和替换。我尝试使用Sublime Text的6677,jumanji,1995
功能,但它运行正常,但我最终丢失了数据的第一列(唯一ID)。
任何人都可以推荐一种更好的方法来摆脱这些重复的行吗?
答案 0 :(得分:0)
以下perl脚本可以解决问题。实际上,所有出现的电影都会从条目列表中删除。不要忘记添加文件路径。执行' perl'从命令行(mac os附带perl):
use IO::File;
my (
$curline
, $fh_in
, $fh_out
, $dict
, @fields
, $key
, $value
);
$fh_in = new IO::File("<..."); # add input file name
$fh_out = new IO::File(">..."); # add output file name
while (<$fh_in>) {
chomp;
$curline = $_;
@fields = split ( /,/, $curline );
($key, $value) = (join(',', @fields[1..$#fields]), $fields[0]);
if (!exists($$dict{$key})) {
$$dict{$key} = 1;
$fh_out->print("$curline\n");
}
}
$fh_out->close();
exit(0);
<强>解释强>
<强>买者强>
通过规范化键可以添加一定程度的容错。示例(不区分大小写的匹配):
my $key_norm; # move that out of the loop in production code
$key_norm = lc($key);
if (!exists($$dict{$key_norm})) {
$$dict{$key_norm} = 1;
$fh_out->print("$curline\n");
}
在编写此代码时,优雅和表现都没有发言权; - )