You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中拆分姓名并统计首名的出现次数?

问题描述

我有一个存储姓名的文件,格式如下:

Name Name    Surname Surname

文件具体内容为:

Nikola  KAZIKOVA
Pavel   MILAN GAZDIK
Nikolas Martin  STRUP
Nikola  GAZDIK
Nikola ČERNÁ
Nikola Martina ČERNÁ

我想要编写一个Bash脚本,在每条姓名旁打印其首名的出现次数,但不知道如何实现统计功能。我已编写了部分代码,可以将文本加载到数组中,但无法完成姓名统计:

#!/bin/bash

file=$1

if [[ -z $1 ]]
    then echo "ERROR: FILE NOT FOUND"
    exit
fi


# Read the file in parameter and fill the array named "array"
getArray() {
    array=() # Create array
    while IFS= read -r line # Read a line
    do
        array+=("$line") # Append line to the array
    done < "$1"
}

# Print the file (print each element of the array)
getArray $file
for e in "${array[@]}"
do
    IFS='   ' read -ra arr <<< "$e"
    echo "${arr[0]}" | grep -o "${arr[0]}"

done

期望实现的输出结果为:

[4] Nikola  KAZIKOVA
   [1] Pavel   MILAN GAZDIK
   [1] Nikolas Martin  STRUP
   [4] Nikola  GAZDIK
   [4] Nikola ČERNÁ
   [4] Nikola Martina ČERNÁ
解决方案

要实现首名统计并按要求输出,可分两步完成:先批量统计所有首名的出现次数,再遍历每行输出对应结果。

完整脚本代码

#!/bin/bash

# 检查输入参数是否为空
if [[ -z $1 ]]; then
    echo "ERROR: FILE NOT FOUND"
    exit 1
fi

file="$1"

# 第一步:用关联数组统计所有首名的出现次数
declare -A first_name_counts
while IFS= read -r line; do
    # 提取每行的第一个字段作为首名
    first_name=$(echo "$line" | awk '{print $1}')
    # 对应首名的计数加1
    ((first_name_counts["$first_name"]++))
done < "$file"

# 第二步:遍历文件每行,格式化输出带计数的结果
while IFS= read -r line; do
    first_name=$(echo "$line" | awk '{print $1}')
    count=${first_name_counts["$first_name"]}
    # 用printf实现统一对齐的输出格式
    printf "   [%d] %s\n" "$count" "$line"
done < "$file"

关键细节说明

  1. 关联数组统计:用declare -A定义关联数组first_name_counts,可以直接用首名作为键,实现高效的计数累加。
  2. 可靠提取首名:使用awk '{print $1}'提取每行第一个字段,能自动处理不同数量的空格分隔,比手动分割数组更稳定。
  3. 格式化输出:printf的格式化语法可以确保[数字]部分和姓名内容对齐,完全匹配期望的输出样式。

运行方式

将脚本保存为count_first_names.sh,赋予执行权限:

chmod +x count_first_names.sh

然后执行脚本并传入姓名文件路径:

./count_first_names.sh 你的姓名文件名.txt

内容的提问来源于stack exchange,提问作者mitas1c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:41:12