使用gawk转文本为CSV未达预期,求正确实现方案
解决方法:自定义AWK脚本提取字段并生成标准CSV
你的原命令问题在于只是简单把段落内的换行替换成逗号,但没有处理「字段名: 值」的结构分离,也没过滤掉记录分隔线。我们可以写一个更精准的AWK脚本来完成需求:
完整AWK脚本
假设你的输入文件用单独一行的---作为记录分隔符(如果是其他分隔符,后面会说明调整方式),下面的脚本会自动提取简化后的字段名(去掉末尾的#)和对应值,输出符合预期的CSV:
BEGIN { # 设置记录分隔符为单独一行的---(根据你的实际分隔线修改) RS = "^---$" # 每个记录内的行分隔符为换行 FS = "\n" # CSV列分隔符 OFS = "," # 输出简化后的表头 print "time,dt,Shot" } # 处理非空记录(跳过文件开头/结尾的空分隔块) NF > 0 { # 清空存储值的数组,避免残留上一条记录的数据 delete field_vals # 遍历当前记录内的每一行 for (i = 1; i <= NF; i++) { current_line = $i # 跳过空行 if (current_line == "") continue # 拆分字段名和值(假设格式为「字段名: 值」) split(current_line, parts, ": ") raw_field = parts[1] # 去掉字段名末尾的" #",比如把"dt #"转为"dt" gsub(/ #$/, "", raw_field) # 把值存入数组,用处理后的字段名作为键 field_vals[raw_field] = parts[2] } # 按表头顺序输出对应的值 print field_vals["time"], field_vals["dt"], field_vals["Shot"] }
使用方式
- 把上面的代码保存为
convert_records.awk文件 - 执行命令完成转换:
gawk -f convert_records.awk your_input.txt > output.csv
或者直接用一行命令快速测试:
gawk 'BEGIN{RS="^---$";FS="\n";OFS=",";print "time,dt,Shot"} NF>0{delete field_vals;for(i=1;i<=NF;i++){l=$i;if(l=="")continue;split(l,p,": ");f=p[1];gsub(/ #$/,"",f);field_vals[f]=p[2]} print field_vals["time"],field_vals["dt"],field_vals["Shot"]}' your_input.txt > output.csv
自定义调整指南
- 分隔线不同:如果你的记录分隔符不是
---(比如是=====),只需把RS = "^---$"改成RS = "^=====$"(^和$确保匹配单独一行的分隔符) - 字段名格式不同:如果字段名是
dt#而非dt #,把gsub(/ #$/, "", raw_field)改成gsub(/#$/, "", raw_field) - 新增字段:比如要添加
Temp字段,只需修改表头为"time,dt,Shot,Temp",并在最后一行print语句里追加, field_vals["Temp"]
原命令失效原因
你之前的命令gawk -F'\n' -v RS= -v OFS=',' -v ORS='\n' '{$1=$1}1' file.txt只是把空白行分隔的段落里的换行替换成逗号,完全没有处理「字段名: 值」的结构拆分,也没过滤分隔线,所以输出会包含time: 2024-xx-xx这类完整行,自然不符合CSV的需求。
内容的提问来源于stack exchange,提问作者OXXO
相关产品推荐
相关产品推荐

