首页 > 解决方案 > 更改固定格式文件中的选定列

问题描述

我有一个以下文件(实际上它有更多的列和大量的行)

   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

标签: shell

解决方案


您提到您有一个具有特定输出的固定格式文件。您的第 6 列的格式I4是 Fortran 格式说明符。

由于我们没有完整的格式,我做了以下操作:

  1. 获取第 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

推荐阅读