如何在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"
关键细节说明
- 关联数组统计:用
declare -A定义关联数组first_name_counts,可以直接用首名作为键,实现高效的计数累加。 - 可靠提取首名:使用
awk '{print $1}'提取每行第一个字段,能自动处理不同数量的空格分隔,比手动分割数组更稳定。 - 格式化输出:
printf的格式化语法可以确保[数字]部分和姓名内容对齐,完全匹配期望的输出样式。
运行方式
将脚本保存为count_first_names.sh,赋予执行权限:
chmod +x count_first_names.sh
然后执行脚本并传入姓名文件路径:
./count_first_names.sh 你的姓名文件名.txt
内容的提问来源于stack exchange,提问作者mitas1c
相关产品推荐
相关产品推荐

