shell - 更改固定格式文件中的选定列
问题描述
我有一个以下文件(实际上它有更多的列和大量的行)
0 0 -39 36.093 14.981 3-0.71520 0.71520-0.16345 0.16345-0.67954-0.67954
0 0 -40 336.902 26.500 2-0.69704 0.69704-0.16844 0.16844-0.69696-0.69696
0 0 -41 37.034 15.869 5-0.67794 0.67794-0.17335 0.17335-0.71439-0.71439
0 0 -42 27.538 14.992 1-0.65776 0.65776-0.17833 0.17833-0.73181-0.73181
它是一个固定格式的文件。在第 6 列中,我有从 1 到 5 的数字(格式:I4)。在这个特定的列中,我需要将 1 替换为 20、2->21 等,而所有其他条目不受影响。在这个例子中,它会产生类似的东西:
0 0 -39 36.093 14.981 22-0.71520 0.71520-0.16345 0.16345-0.67954-0.67954
0 0 -40 336.902 26.500 21-0.69704 0.69704-0.16844 0.16844-0.69696-0.69696
0 0 -41 37.034 15.869 25-0.67794 0.67794-0.17335 0.17335-0.71439-0.71439
0 0 -42 27.538 14.992 20-0.65776 0.65776-0.17833 0.17833-0.73181-0.73181
我查看了论坛,但似乎没有一个解决方案正是我的情况。提前非常感谢。
这是该问题的附录。这是原始单行(注意空格):
0 0 -39 36.093 14.981 3-0.71520 0.71520-0.16345 0.16345-0.67954-0.67954 0 287.85 405.71 5.51 287.32 405.17 5.58 1.894 0.53 11.62 90.00 322.65 2 9561 2947 8902 1.67 1 1.000 536346150 -4 0.936 33.55 151.65 91.270 174.170 1
最后建议的解决方案给出:
0 0 -39 36.093 14.981 23-0.71520 0.71520-0.16345 0.16345-0.67954-0.67954 0 287.85 405.71 5.51 287.32 405.17 5.58 1.894 0.53 11.62 90.00 322.65 2 9561 2947 8902 1.67 1 1.000 536346150 -4 0.936 33.55 151.65 91.270 174.170 1
解决方案
您提到您有一个具有特定输出的固定格式文件。您的第 6 列的格式I4
是 Fortran 格式说明符。
由于我们没有完整的格式,我做了以下操作:
获取第 5 列的位置
$ awk '{match($0,$5); print RSTART+RLENGTH-1; exit}' file 28
这意味着第 6 列从位置 29 开始,长度为 4。基于这个数字,我们现在可以将每个文件分成 3 个部分。第一个长度为 28 的字符串,第二个长度为 4 的字符串,第三个字符串是余数。我们将 20 添加到第二部分并以相同的格式打印:
$ awk '{p1=substr($0,1,28); p2=substr($0,29,4); p3=substr($0,33)}
{ printf "%s%4d%s\n", p1,p2+20,p3}' file
推荐阅读
- python-3.x - 如何修复错误“未定义大文本”?,我不确定我是否打算在代码开头定义它
- node.js - 如何在反应中显示base64图像?
- python - 由于 User-Agent 问题导致 AIOHTTP 客户端超时
- mobile - SQLite 错误没有这样的表:resco 现场服务移动应用程序中的活动指针
- reactjs - React Hooks 与 React-redux
- rdf - 在 Virtuoso 中批量加载 Wikidata 转储
- javascript - OfficeGen如何设置表格数据文字大小?
- php - Wordpress 图片路径正确,但图片未在网站上显示
- swift - Mapbox GeoCoder --> 如何获取附近的餐馆、酒店、购物中心等
- c# - 如何在边界上画一条直线,将其分成两半