我正在尝试编写一个Perl脚本,可以检查csv文件是否在最后两列中有双重数据。如果找到双重数据,则应添加带有“doublet”一词的附加列:
示例,原始文件如下所示:
cat,111,dog,555
cat,444,dog,222
mouse,333,dog,555
mouse,555,cat,555
最终输出文件应如下所示:
cat,111,dog,555,doublet
cat,444,dog,222
mouse,333,dog,555,doublet
mouse,555,cat,555
我是Perl脚本的新手,所以我不会暴露自己到目前为止所写的内容。我试图通读文件将数据拆分为两个数组,一个包含前两列,另一个包含最后两列
然后想法检查第二个数组中的doublets,并将带有“doublets”信息的附加列添加(推送?)到该数组,然后再将两个数组合并到一起(?)
不幸的是,我的大脑现在已经崩溃了,我需要一些比我更聪明的人的帮助,引导我朝着正确的方向前进。
非常感谢任何帮助,谢谢。
答案 0 :(得分:-1)
这不是最有效的方法,但这里可以帮助您入门。脚本假定您的输入数据以逗号分隔,并且可以包含任意数量的列。
#!/usr/bin/env perl
use strict;
use warnings;
my %h;
my @lines;
while (<>) {
chomp;
push (@lines,$_); # save each line
my @fields = split(/,/,$_);
if(@fields > 1) {
$h{join("",@fields[-2,-1])}++; # keep track of how many times a doublet appears.
}
}
# go back through the lines. If doublet appears 2 or more times, append ',doublet' to the output.
foreach (@lines) {
my $d = "";
my @fields = split(/,/,$_);
if (@fields > 1 && $h{join("",@fields[-2,-1])} >= 2) {
$d = ",doublet";
}
print $_,$d,$/;
}
语法@fields[-2,-1]
是一个数组切片,它返回一个包含最后两列值的数组。然后,join("",...)
将它们连接在一起,这成为哈希的关键。 $/
是输入记录分隔符,默认情况下是换行符,写入速度比"\n"
cat,111,dog,555,doublet
cat,444,dog,222
mouse,333,dog,555,doublet
mouse,555,cat,555