如何使用Bash从文本文件提取数值并重新整理为指定列格式?
解决Bash下提取并格式化数值数据的问题
我来帮你搞定这个从大文本文件里提取指定数值并整理成列的需求!你的初始命令有几个小问题,咱们一步步来修正并实现目标。
先说说你原来命令的问题
你用的grep -e 'magnitude|surface area|volume' '{print}' original_file.txt有两个关键错误:
- grep默认不支持
|这种扩展正则语法,得加-E选项;而且{print}是awk的语法,grep根本不认识它,所以这个命令没法正常工作。 - 就算grep能匹配到行,也只是把这些行单独提取出来,没法把同一组的三个值合并成一行,更没法整理成列。
推荐解决方案:用awk+column处理
awk非常擅长这种需要跟踪多行数据并格式化输出的场景,配合column -t还能自动对齐列,完美满足你的需求。
完整命令
awk ' # 先打印表头 BEGIN { print "magnitude", "surface area", "volume" } # 提取magnitude的数值、误差和单位 /magnitude :/ { mag = $3 "+-" $5 " " $6 } # 提取surface area的数值、误差和单位 /surface area :/ { area = $4 "+-" $6 " " $7 } # 提取volume的数值、误差和单位,凑齐三个值后打印一行 /volume :/ { vol = $3 "+-" $5 " " $6 print mag, area, vol } ' original_file.txt | column -t > new_file.txt
命令解释
- BEGIN块:在处理文件内容之前,先打印表头行。
- 匹配magnitude行:行里的第3个字段是主数值(比如
38.662),第5个是误差(0.0556),第6个是单位(N),把它们拼接成38.662+-0.0556 N存在变量mag里。 - 匹配surface area行:因为字段里有空格,所以主数值是第4个字段,误差是第6个,单位是第7个,拼接后存在
area变量。 - 匹配volume行:同样提取拼接后存在
vol,这时候同一组的三个值都收集齐了,就打印这三个变量。 - column -t:把输出的内容按列对齐,让表格看起来更整齐。
运行效果
用你提供的示例数据运行后,new_file.txt里的内容就是你期望的格式:
magnitude surface area volume 38.662+-0.0556 N 31.882+-0.0584 m^2 545.56+-0.6562 m^3 38.682+-0.0606 N 31.832+-0.0587 m^2 545.78+-0.6362 m^3
如果你的数据里每组的三个行顺序固定(magnitude → surface area → volume),这个命令就能完美工作;如果顺序可能变化,咱们可以再调整逻辑,但从你的示例来看顺序是固定的,所以这个方案完全够用。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

