首页 >> 个人仿真建议 >>个人脚本 >>bash >> 3列每78行数字的加和
详细内容

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


最新评论
请先登录才能进行回复登录
技术支持: CLOUD | 管理登录
seo seo