如何使用BASH将TXT文件数据按不同列存入CSV文件
修改后的完整BASH脚本
#!/bin/bash inputFiles=("./Successes/SuccessSummary.txt" "./Failures/FailSummary.txt") # 初始化四个数组存储对应类别的数值 declare -a scan_arr check_arr move_arr switch_arr # 标记当前读取的类别 current_section="" # 遍历所有输入文件 for file in "${inputFiles[@]}" do while IFS= read -r line do # 跳过空行 [[ -z "$line" ]] && continue # 判断当前行是否为类别行,更新类别标记 if [ "$line" = "Scan Times:" ] then current_section="scan" continue fi if [ "$line" = "Check Times:" ] then current_section="check" continue fi if [ "$line" = "Move Times:" ] then current_section="move" continue fi # 注意:你原TXT里对应类别是Switch Times,原脚本里写的Switch Distances,这里做了修正 if [ "$line" = "Switch Times:" ] then current_section="switch" continue fi # 提取当前行的数值(去掉seconds和前后空格) val=$(echo "$line" | awk '{print $1}') # 根据当前类别把数值存入对应数组 case $current_section in "scan") scan_arr+=("$val") ;; "check") check_arr+=("$val") ;; "move") move_arr+=("$val") ;; "switch") switch_arr+=("$val") ;; esac done < "$file" done # 写入CSV表头 echo "Scan Times,Check Times,Move Times,Switch Times" > results.csv # 取最长数组的长度作为遍历上限,避免数据缺失 max_len=${#scan_arr[@]} [[ ${#check_arr[@]} -gt $max_len ]] && max_len=${#check_arr[@]} [[ ${#move_arr[@]} -gt $max_len ]] && max_len=${#move_arr[@]} [[ ${#switch_arr[@]} -gt $max_len ]] && max_len=${#switch_arr[@]} # 遍历索引,拼接每一行CSV内容 for ((i=0; i<max_len; i++)) do scan_val=${scan_arr[$i]:-} check_val=${check_arr[$i]:-} move_val=${move_arr[$i]:-} switch_val=${switch_arr[$i]:-} echo "${scan_val},${check_val},${move_val},${switch_val}" >> results.csv done
注意事项
- 你原脚本中类别判断写的是
Switch Distances:,和提供的TXT结构里的Switch Times:不一致,脚本已做修正,如果实际文件中确实是Switch Distances可自行改回判断条件 - 脚本会自动合并所有输入文件的同类别数据,若不同类别的数据行数不一致,缺少的位置会自动留空
- 生成的results.csv第一行为表头,后续每一行对应四个类别的同位置数值
内容的提问来源于stack exchange,提问作者palacetrading
相关产品推荐
相关产品推荐

