根据第二列求和第一列

根据第二列求和第一列

我编写了一个 Bash 脚本,它将文件中的记录数(行数)和目录中存在的文件名存储在 output.txt 文件中。

输出.txt 文件如下。

No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

所需结果

输出.txt

No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

TOTAL :
1714083  UnixfileName
295169219 NextUnixFileName

笔记:

如果文件名类似于 UnixFileName,则对 No.ofRecord 求和

如果文件名类似于 NextUnixFileName,则对 No.ofRecord 求和。

提前致谢。

答案1

$ awk 'NR > 1 { k = substr($2, 4); cnt[k] += $1 } { print } END { print "\nTOTAL:"; for (k in cnt) print cnt[k], k }' file
No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

TOTAL:
1714083 UnixfileName.txt
295169219 NextUnixFileName.txt

awk脚本根据一个键对第一列进行求和,k该键从第四个字符开始作为第二列。这是对文件中的所有输入行执行的操作,除了第一行(这是标题)。所有输入行都未经修改地作为输出传递。

最后,打印每个找到的键的总数。

为了使总计的列宽与其余数据相同,最后一个print cnt[k], k可能会更改为以下形式

printf("%-15d%s\n", cnt[k], k)

它将数字格式化为左对齐、15 个字符宽的整数。

相关内容