待统计文件格式
/path/*/*.txt
.txt文件格式为:间隔为>=1个空格,数目不定,名称内无空格
type probability name
注:name内可能存在空格
目的
统计所有文件夹内,指定路径下的txt文件,统计每个文件夹内name出现的次数,输出到一个文件中
脚本实现
#!/bin/bash
# 定义输出文件
output_file="output.txt"
# 清空输出文件
truncate -s 0 "$output_file"
# 遍历指定目录下的所有文件夹
for dir in /path/*; do
# 检查是否是目录
if [ -d "$dir" ]; then
# 定义关联数组来跟踪name的计数
declare -A name_count
# 文件夹之间独立,需要清空之前数组
unset name_count
# 遍历目录下的所有.txt文件
for file in "$dir"/path/to/*.txt; do
# 检查是否是文件
if [ -f "$file" ]; then
# 读取文件内容
while IFS= read -r line; do
# name=$(echo "$line" | awk '{print $3}')
name=$(echo "$line" | awk '{for (i=2; i<=NF; i++) printf $i " "; printf ""}')
if [[ -n "$name" ]]; then
# 累加name出现的次数
((name_count["$name"]++))
fi
done < "$file"
fi
done
# 将结果写入输出文件
for name in "${!name_count[@]}"; do
echo "$(basename "$dir"),$name,${name_count[$name]}" >> "$output_file"
done
fi
done
执行
sh script.sh /path/to/input/folder /path/to/output.txt
输出文件
folder1,name1,2
folder1,name2,1
folder2,name2,4
优化
可以根据用户输入指定输出文件、输出目录等
#!/bin/bash
# 检查是否提供了输入文件夹和输出文件名
if [ "$#" -ne 2 ]; then
echo "用法: $0 <输入文件夹路径> <输出文件名>"
exit 1
fi
input_dir="$1"
output_file="$2"
# 清空输出文件
truncate -s 0 "$output_file"
# 遍历指定目录下的所有文件夹
for dir in "$input_dir"/*; do
# 检查是否是目录
if [ -d "$dir" ]; then
# 定义关联数组来跟踪name的计数
declare -A name_count
# 文件夹之间独立,需要清空之前数组
unset name_count
# 遍历目录下的指定路径下的所有.txt文件,
for file in "$dir"/path/to/*.txt; do
# 检查是否是文件
if [ -f "$file" ]; then
# 读取文件内容
while IFS= read -r line; do
# name=$(echo "$line" | awk '{print $3}')
**name=$(echo "$line" | awk '{for (i=2; i<=NF; i++) printf $i " "; printf ""}')
if [[ -n "$name" ]]; then
# 累加name出现的次数
((name_count["$name"]++))
fi
done < "$file"
fi
done
# 将结果写入输出文件
for name in "${!name_count[@]}"; do
echo "$(basename "$dir"),$name,${name_count[$name]}" >> "$output_file"
done
fi
done
注:也可以定义输出文件分隔符