gpt4 book ai didi

linux - 统计替换重复值后的记录数

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:56 25 4
gpt4 key购买 nike

一个作业在服务器上运行并创建如下文件:

1000727888004
522101 John Smith
522101 John Smith
522188 Shelly King
522188 Shelly King
1000727888002
522990 John Doe
522990 John Doe
9000006000000

目前,我们正在修复代码,但这需要一个月的时间。同时,我正在使用如下命令删除重复记录。

perl -ne 'print unless $dup{$_}++;' old_file.txt > new_file.txt

在我运行上面的命令后,它删除了重复的条目,但计数保持不变,如下所示:

1000727888004
522101 John Smith
522188 Shelly King
1000727888002
522990 John Doe
9000006000000

从 1 开始的行的最后一个数字是总计数(因此第一行中的 4 应该是 2,第四行中的 2 应该是 1,最后一行中从 9 开始的 6 应该是 3)。它应该如下所示:

1000727888002
522101 John Smith
522188 Shelly King
1000727888001
522990 John Doe
9000003000000

我想不出任何可以解决它的逻辑。我在这里需要帮助。我可以运行另一个命令或在我的 perl 命令中添加一些东西来更正计数吗?是的,我可以在 Notepad++ 中打开文件并手动修复数字,但我正在尝试使其自动化。

谢谢!

最佳答案

在 awk 中。它处理计数记录之间的“ block ”内的重复项,即。它不考虑整个文件中的重复项。如果这是不正确的假设,请告诉我。

$ awk '
NF==1 { # for the cout record
if(c!="") # this fixes leading empty row
print c # print count
for(i in a) # all deduped data records
print i # print them
delete a # empty hash
c=$0 # store count (well, you could use just the first count record)
next # for this record don't process further
}
{
if($0 in a) # if current record is already in a
c-- # decrease count
else a[$0] # else hash it
}
END { # last record handling
print c # print the last record
for(i in a) # just in case last record would be missing
print i # this and above could be removes
}' file

输出:

1000727888002
522101 John Smith
522188 Shelly King
1000727888001
522990 John Doe
9000006000000

如果在整个文件中删除了重复项并且最后一条记录也是计数:

awk '
NF==1 {
if(NR==1)
c=$0
print c
}
NF>1 {
if($0 in a)
c--
else {
a[$0]
print
}
}' file
1000727888004
522101 John Smith
522188 Shelly King
1000727888002
522990 John Doe
1000727888001

关于linux - 统计替换重复值后的记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43565387/

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