gpt4 book ai didi

python - 删除重复项但保留序列的第一个和最后一个记录

转载 作者:行者123 更新时间:2023-11-28 22:40:26 31 4
gpt4 key购买 nike

如果输入文件是:

400102-25,6:50,90005002,1
400102-25,6:50,90005004,2
400102-25,7:00,90002109,3
400102-25,7:00,90002107,4
400102-25,7:05,90002111,5
400102-25,7:05,90002106,6
6004-10,13:05,90006017,1
6004-10,13:05,90006022,2
6004-10,13:20,90006030,3
6004-10,13:20,90006015,4
6004-10,13:20,90006019,5
6004-10,13:30,90006034,6
6004-10,13:40,90006033,7
6004-10,13:40,90006002,8

有没有办法获得这个输出:

400102-25,6:50,90005002,1
400102-25,,90005004,2
400102-25,7:00,90002109,3
400102-25,,90002107,4
400102-25,,90002111,5
400102-25,7:05,90002106,6
6004-10,13:05,90006017,1
6004-10,,90006022,2
6004-10,13:20,90006030,3
6004-10,,90006015,4
6004-10,,90006019,5
6004-10,13:30,90006034,6
6004-10,,90006033,7
6004-10,13:40,90006002,8

我想删除字段 2 的重复项(逗号分隔)并用逗号替换,但保留第 4 列确定的每个序列的第一个和最后一个记录。

我认为部分结果可以通过

 awk '{FS=OFS=","} { if(!seen[$1 $2]++) print $0 ; else print $1,","$3, $4 } END{print}' input

但这并不能解决所有问题。有什么建议吗?

最佳答案

这个解决方案做出了几个假设。第一个字段与从 1 到 ... 的数字序列相同,每个序列的第一个字段宽度(字符数)相同,并且第一个字段按排序顺序排列。它不使用最后一个字段来确定记录组,而是使用第一个字段来确定。

#!/usr/bin/perl
use strict;
use warnings;

my %data;

while (<DATA>) {
my ($key, @tmp) = split /,/;
push @{ $data{$key} }, \@tmp;
}

for my $key (sort keys %data) {
my $aref = $data{$key};
my $end = $aref->[-1][0];

for my $rec (reverse @$aref[1 .. $#$aref - 1]) {
if ($rec->[0] eq $end) {
$rec->[0] = '';
}
else {
last;
}
}
my $beg = $aref->[0][0];

for my $rec (@$aref[1 .. $#$aref - 1]) {
if ($rec->[0] eq $beg) {
$rec->[0] = '';
}
else {
$beg = $rec->[0];
}
}
for my $line (@$aref) {
print join ",", $key, @$line;
}
}


__DATA__
400102-25,6:50,90005002,1
400102-25,6:50,90005004,2
400102-25,7:00,90002109,3
400102-25,7:00,90002107,4
400102-25,7:05,90002111,5
400102-25,7:05,90002106,6
600004-10,13:05,90006017,1
600004-10,13:05,90006022,2
600004-10,13:20,90006030,3
600004-10,13:20,90006015,4
600004-10,13:30,90006034,5
600004-10,13:40,90006033,6
600004-10,13:40,90006002,7

输出

400102-25,6:50,90005002,1
400102-25,,90005004,2
400102-25,7:00,90002109,3
400102-25,,90002107,4
400102-25,,90002111,5
400102-25,7:05,90002106,6
600004-10,13:05,90006017,1
600004-10,,90006022,2
600004-10,13:20,90006030,3
600004-10,,90006015,4
600004-10,13:30,90006034,5
600004-10,,90006033,6
600004-10,13:40,90006002,7

更新

为了适应您的新数据要求,我取出散列并改用数组(以保留输入文件的原始顺序)。请注意,您将用来运行该程序的命令类似于:

perl test.pl dat3.txt

其中 test.pl 是您的程序名称,dat3.txt 是要处理的输入文件。

#!/usr/bin/perl
use strict;
use warnings;

my @data = [split /,/, <>];
my $i = $data[0][3];

while (<>) {
my @temp = split /,/;
if ($temp[3] == ++$i) {
push @data, \@temp;
}
else {
process(@data);
@data = \@temp;
$i = $data[0][3];
}
}

process(@data);

sub process {
my @data = @_;

my $end = $data[-1][1];
for my $rec (reverse @data[1 .. $#data - 1]) {
if ($rec->[1] eq $end) {
$rec->[1] = '';
}
else {
last;
}
}
my $beg = $data[0][1];

for my $rec (@data[1 .. $#data - 1]) {
if ($rec->[1] eq $beg) {
$rec->[1] = '';
}
else {
$beg = $rec->[1];
}
}
print map join(",", @$_), @data;
}

输出是:

400102-25,6:50,90005002,1
400102-25,,90005004,2
400102-25,7:00,90002109,3
400102-25,,90002107,4
400102-25,,90002111,5
400102-25,7:05,90002106,6
6004-10,13:05,90006017,1
6004-10,,90006022,2
6004-10,13:20,90006030,3
6004-10,,90006015,4
6004-10,,90006019,5
6004-10,13:30,90006034,6
6004-10,,90006033,7
6004-10,13:40,90006002,8

关于python - 删除重复项但保留序列的第一个和最后一个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682692/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com