|
3列每78行数字的加和时间:2025-04-28 #!/bin/bash input="pipi_count.txt" #输入需要处理的文本 output="pipi_count-total.txt" #生成新的文本 # 清空旧文件(使用重定向替代rm) : > "$output" # 预定义局部变量,该脚本设置为统计3列数值每列的加和,所以用sum1/2/3,如果需要n列,则写sum1/..../n declare -i sum1=0 sum2=0 sum3=0 line_counter=0 record_num=0 # 一次性读取文件到数组(避免重复IO),+2表示为第2行,7879表示为读取的最后一行 mapfile -t lines < <(tail -n +2 "$input" | head -n 7879) # 高效处理循环(C风格循环比while更快) for ((i=1; i<${#lines[@]}; i++)); do line="${lines[i]}"
# 使用Bash内置字符串操作(避免cut/tr子进程) num1=${line:13:4} # 14-17字符,对应sum1的加和,13表示13个字符之后,4为后4个字符,就是14-17 num2=${line:19:4} # 20-23字符,同上 num3=${line:25:4} # 26-29字符,同上
# 数值累加(强制十进制),根据自己需要加和的列数与前面进行保持一致 ((sum1 += 10#${num1// /})) ((sum2 += 10#${num2// /})) ((sum3 += 10#${num3// /}))
((line_counter++))
# 每78行输出,注意每次加和需要的行数 if (( line_counter == 78 )); then printf "%5d %8d %8d %8d\n" \ "$record_num" "$sum1" "$sum2" "$sum3" >> "$output" sum1=0 sum2=0 sum3=0 line_counter=0 ((record_num++)) fi done # 处理剩余行 if (( line_counter > 0 )); then printf "%5d %8d %8d %8d\n" \ "$record_num" "$sum1" "$sum2" "$sum3" >> "$output" fi |