gpt4 book ai didi

bash - Shell 命令对文件中相似文本行的数字求和

转载 作者:行者123 更新时间:2023-12-02 00:16:11 32 4
gpt4 key购买 nike

我有一个包含数千行的文件,每行包含一个数字后跟一行文本。我想将文本相似的行的数字相加。我也希望输出独特的线条。

例如:

25 cup of coffee
75 sign on the dotted
28 take a test
2 take a test
12 cup of coffee

输出将是:

37 cup of coffee
75 sign on the dotted
30 take a test

关于如何在 unix shell 中实现这一点有什么建议吗?

我看了Shell command to sum integers, one per line?但这是关于汇总文件中所有行的一列数字,而不仅仅是相似的文本行。

最佳答案

不需要多个进程和管道。 awk一个人就足以处理整个工作(并且在大文件上会快几个数量级)。与 awk只需附加每个字段 2-NF作为字符串并将其用作索引以对数组中字段 1 中的数字求和。然后在END部分,简单地输出数组的内容,例如假设您的数据存储在 file 中,你可以这样做:

awk '{
for (i=2; i<=NF; i++)
str = str " " $i
a[str] += $1
str=""
}
END {
for (i in a) print a[i], i
}' file

以上,第一个for循环简单地附加来自 2-NF 的所有字段在str , a[str] += $1将字段 1 中的值求和到数组 a使用 str作为索引。这确保了相似行的值相加。在END部分,您只需遍历数组的每个元素,输出元素值(总和),然后是索引(字段 str 的原始 2-NF)。

示例使用/输出

只需选择上面的内容,选择它,然后用鼠标中键将其粘贴到您的 file 所在目录的命令行中。位于(将 file 的名称更改为您的数据文件名)

$ awk '{
> for (i=2; i<=NF; i++)
> str = str " " $i
> a[str] += $1
> str=""
> }
> END {
> for (i in a) print a[i], i
> }' file
30 take a test
37 cup of coffee
75 sign on the dotted

如果您希望行以不同的顺序排序,只需添加 | sort [options]在文件名之后将输出通过管道传输到 sort .例如,对于按您显示的顺序输出,您将使用 | sort -k 2输出将是:

37  cup of coffee
75 sign on the dotted
30 take a test

保留字符串的原始顺序

根据您关于如何保留在输入文件中看到的文本行的原始顺序的评论,您可以保留第二个数组,其中字符串按照使用顺序索引的顺序存储在其中命令。例如 o下面使用数组(顺序数组)来存储唯一字符串(字段 2-NF )和变量 n用作计数器。数组上的循环用于检查字符串是否已包含,如果包含,next用于避免存储字符串并跳转到输入的下一条记录。在 END然后循环使用 for (i = 0; i < n; i++)以字符串在原始文件中出现的顺序从两个数组中输出信息的形式,例如

awk -v n=0 '{
for (i=2; i<=NF; i++)
str = str " " $i
a[str] += $1
for (i = 0; i < n; i++)
if (o[i] == str) {
str=""
next;
}
o[n++] = str;
str=""
}
END {
for (i = 0; i < n; i++) print a[o[i]], o[i]
}' file

输出

37  cup of coffee
75 sign on the dotted
30 take a test

关于bash - Shell 命令对文件中相似文本行的数字求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56884654/

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