如何使用gawk将批量文本数据转置为多列CSV文件?
解决CSV多列输出的问题
我来帮你搞定这个问题——你的核心需求是把每个measured行去掉前两个元素(measured和首个数值)后,转换成CSV的一行(多列),但当前的gawk脚本因为输出分隔符设置和逻辑问题,把所有数据都输出成了单列,咱们一步步修正:
问题根源分析
你原来的脚本有两个关键问题:
- 把
OFS(输出字段分隔符)设成了换行符\n,导致每个数值都被单独拆成一行,自然变成了单列; - 脚本里的
c变量逻辑会触发重复打印,进一步打乱输出结构。
修正后的gawk脚本
我们需要把输出分隔符改成CSV标准的逗号,,然后只保留每个measured行从第3个字段开始的内容,输出为一行。
你可以把下面的代码保存为process.awk:
BEGIN { # 设置CSV的字段分隔符为逗号 OFS = "," } # 只处理包含"measured"关键字的行 /measured/ { # 从第3个字段开始遍历到最后一个字段 for (i=3; i<=NF; i++) { # 除了第一个字段,前面加逗号分隔 if (i != 3) { printf "%s", OFS } printf "%s", $i } # 打印换行符,结束当前CSV行 print "" }
或者更简洁的写法(利用gawk的字段重排特性):
BEGIN { OFS = "," } /measured/ { # 删除前两个字段(measured和首个数值) $1 = $2 = "" # 重新整理字段,自动去掉开头的空字段 $0 = $0 # 打印处理后的行,字段会用逗号分隔 print }
修正Windows批处理命令
还要确保输出文件夹存在,并且正确遍历所有文件。如果是用批处理文件执行,保存为process_files.bat:
@echo off :: 创建输出文件夹,已存在则忽略错误 mkdir finaloutput 2>nul :: 遍历当前目录所有文件,处理后追加到CSV for %%f in (*) do ( gawk -f process.awk "%%f" >> finaloutput\burnup.csv )
如果是直接在命令行执行,把%%f改成%f即可。
效果验证
处理你给出的示例输入后,会得到这样的多列CSV内容:
0.0000,0.0000,0.0125,0.0161,0.0203,0.0230,0.0233,0.0236,0.0241,0.0243,0.0239,0.0235,0.0226,0.0207,0.0184,0.0147,0.0000,0.0000 0.0000,0.0000,0.0160,0.0207,0.0260,0.0295,0.0298,0.0302,0.0308,0.0311,0.0306,0.0300,0.0289,0.0264,0.0235,0.0187,0.0000,0.0000
内容的提问来源于stack exchange,提问作者Joe Blough
相关产品推荐
相关产品推荐

