处理Trumpf机床数据文件:特定行数值相乘并生成CSV
处理Trumpf机床大体积数据文件的高效方案
需求说明
现有一份约42000行的Trumpf机床数据文件,需完成以下处理:
- 保留所有原有数据
- 定位仅包含2个有效数值的行,将两数相乘的结果追加至该行末尾
- 最终输出为结构化CSV文件
此前尝试grep、find命令未达预期,需高效解决办法。
数据样例
ELQADDXP.DAT-*test ADDXP 20GA ASTM A1011 0 ELQADDXP.DAT- 7.75000 14.00000 ELQADDXP.DAT- TRUMP 59.6517 0 3 4 ELQADDXQ.DAT-*1140242-0 ADDXQ 20GA ASTM A1011 ELQADDXQ.DAT- 7.75000 14.00000 ELQADDXQ.DAT- TRUMP 59.6517 0 3 4 ELQADDXT.DAT-*1137679-0 ADDXT 16GA ASTM A1011 ELQADDXT.DAT- 8.00000 15. . ELQADDXT.DAT- TRUMP 71.1517 0 3 4
预期输出样例
ELQADDXP.DAT-*test ADDXP 20GA ASTM A1011 0 ELQADDXP.DAT- 7.75000 14.00000 108.500 ELQADDXP.DAT- TRUMP 59.6517 0 3 4 ELQADDXQ.DAT-*1140242-0 ADDXQ 20GA ASTM A1011 ELQADDXQ.DAT- 7.75000 14.00000 108.500 ELQADDXQ.DAT- TRUMP 59.6517 0 3 4 ELQADDXT.DAT-*1137679-0 ADDXT 16GA ASTM A1011 ELQADDXT.DAT- 8.00000 15. . ELQADDXT.DAT- TRUMP 71.1517 0 3 4
高效解决方案:使用AWK处理
AWK是专为文本和数据处理设计的工具,处理大文件(42000行)效率极高,且能直接完成数值计算,完美匹配需求。
执行命令
将以下命令中的input.dat替换为你的源数据文件名,output.csv为输出的CSV文件名:
awk '{ num_count = 0 # 从第2个字段开始遍历,筛选有效数值 for (i=2; i<=NF; i++) { # 匹配整数、小数格式,排除无效字符 if ($i ~ /^[0-9]+(\.[0-9]+)?$|^\.[0-9]+$/) { num_count++ nums[num_count] = $i } } # 仅当有效数值数量为2时,计算并追加乘积 if (num_count == 2) { product = nums[1] * nums[2] # 格式化乘积为3位小数,可调整位数 printf "%s %.3f\n", $0, product } else { # 其他行直接原样输出 print $0 } }' input.dat > output.csv
关键说明
- 数值匹配规则:正则表达式
^[0-9]+(\.[0-9]+)?$|^\.[0-9]+$会匹配所有合法整数(如14)、小数(如7.75000),自动排除像15. .这类无效字段的行。 - 字段遍历逻辑:跳过第1个字段(文件名前缀
ELQXXX.DAT-),仅统计后续字段中的有效数值。 - 兼容性:所有原有数据都会被保留,仅符合条件的行追加乘积结果,不会破坏原有数据结构。
- 性能:AWK处理42000行文件仅需几秒,远快于grep+shell脚本的组合方案。
内容的提问来源于stack exchange,提问作者fletching
相关产品推荐
相关产品推荐

