AWK将null列替换为上一行列值

AWK将null列替换为上一行列值,awk,Awk,我有一系列具有不同列宽的字段分隔文件(符号|): 文件1: 2p | 2P* | 1/2 | 2 | 10.19880615024 | 2s | 2S | 1/2 | 2 | 10.19881052514816 | 2 | |

我有一系列具有不同列宽的字段分隔文件(符号|):

文件1

2p              | 2P*    |  1/2 |    2 |                 10.19880615024                       |
2s              | 2S     |  1/2 |    2 |                 10.19881052514816                    |
2               |        |      |    8 |                 10.1988358                           |
2p              | 2P*    |  3/2 |    4 |                 10.19885151459                       |
3p              | 2P*    |  1/2 |    2 |                 12.0874936591                        |
3s              | 2S     |  1/2 |    2 |                 12.0874949611                        |
3               |        |      |   18 |                 12.0875052                           |
3d              | 2D     |  3/2 |    4 |                 12.0875070783                        |
2s2.2p3            | 4S*    |  3/2 |    4 |             0.0000000               |
2s2.2p3            | 2D*    |  5/2 |    6 |             2.3835298               |
2s2.2p3            | 2D*    |  3/2 |    4 |             2.3846100               |
2s2.2p3            | 2P*    |  1/2 |    2 |             3.5755704               |
2s2.2p3            | 2P*    |  3/2 |    4 |             3.5756182               |
2s2.2p2.(3P).3s    | 4P     |  1/2 |    2 |            10.3259087               |
2s2.2p2.(3P).3s    | 4P     |  3/2 |    4 |            10.3300944               |
2s2.2p2.(3P).3s    | 4P     |  5/2 |    6 |            10.3358956               |
2s2.2p2.(3P).3s    | 2P     |  1/2 |    2 |            10.6796703               |
2s2.2p2.(3P).3s    | 2P     |  3/2 |    4 |            10.6899808               |
文件2:

2s2.2p3            | 4S*    |  3/2 |    4 |             0.0000000               |
2s2.2p3            | 2D*    |  5/2 |    6 |             2.3835298               |
2s2.2p3            |        |  3/2 |    4 |             2.3846100               |
2s2.2p3            | 2P*    |  1/2 |    2 |             3.5755704               |
2s2.2p3            |        |  3/2 |    4 |             3.5756182               |
2s2.2p2.(3P).3s    | 4P     |  1/2 |    2 |            10.3259087               |
2s2.2p2.(3P).3s    |        |  3/2 |    4 |            10.3300944               |
2s2.2p2.(3P).3s    |        |  5/2 |    6 |            10.3358956               |
2s2.2p2.(3P).3s    | 2P     |  1/2 |    2 |            10.6796703               |
2s2.2p2.(3P).3s    |        |  3/2 |    4 |            10.6899808               |
我想用上面最后一个非空列中的相应值填充第二列中的空格: 文件2的示例:

2p              | 2P*    |  1/2 |    2 |                 10.19880615024                       |
2s              | 2S     |  1/2 |    2 |                 10.19881052514816                    |
2               |        |      |    8 |                 10.1988358                           |
2p              | 2P*    |  3/2 |    4 |                 10.19885151459                       |
3p              | 2P*    |  1/2 |    2 |                 12.0874936591                        |
3s              | 2S     |  1/2 |    2 |                 12.0874949611                        |
3               |        |      |   18 |                 12.0875052                           |
3d              | 2D     |  3/2 |    4 |                 12.0875070783                        |
2s2.2p3            | 4S*    |  3/2 |    4 |             0.0000000               |
2s2.2p3            | 2D*    |  5/2 |    6 |             2.3835298               |
2s2.2p3            | 2D*    |  3/2 |    4 |             2.3846100               |
2s2.2p3            | 2P*    |  1/2 |    2 |             3.5755704               |
2s2.2p3            | 2P*    |  3/2 |    4 |             3.5756182               |
2s2.2p2.(3P).3s    | 4P     |  1/2 |    2 |            10.3259087               |
2s2.2p2.(3P).3s    | 4P     |  3/2 |    4 |            10.3300944               |
2s2.2p2.(3P).3s    | 4P     |  5/2 |    6 |            10.3358956               |
2s2.2p2.(3P).3s    | 2P     |  1/2 |    2 |            10.6796703               |
2s2.2p2.(3P).3s    | 2P     |  3/2 |    4 |            10.6899808               |
这个问题类似于我在第一列中通过命令使用awk执行此操作的问题:

awk-F“|”'/^/{$0=(x)substr($0,长度(x)+1)}{x=$1}'1'$file”

然而,我不知道如何使它在第二列(或任何任意列)中工作


有人能帮忙吗?提前谢谢

以您的
文件2
为例,您可以使用此
awk
命令:

awk-vc=2'开始{FS=OFS=“|”}$c~/^[\t]*$/{$c=p}{p=$c}1'文件
2s2.2p3 | 4S*| 3/2 | 4 | 0.0000000|
2s2.2p3 | 2D*| 5/2 | 6 | 2.3835298|
2s2.2p3 | 2D*| 3/2 | 4 | 2.3846100|
2s2.2p3 | 2P*| 1/2 | 2 | 3.5755704|
2s2.2p3 | 2P*| 3/2 | 4 | 3.5756182|
2s2.2p2.(3P).3s | 4P | 1/2 | 2 | 10.3259087|
2s2.2p2.(3P).3s | 4P | 3/2 | 4 | 10.3300944|
2s2.2p2.(3P).3s | 4P | 5/2 | 6 | 10.3358956|
2s2.2p2.(3P).3s | 2P | 1/2 | 2 | 10.6796703|
2s2.2p2.(3P).3s | 2P | 3/2 | 4 | 10.6899808|
要填充第三列,只需传递
c=3
而不是
c=2

回答以前的版本,即文件是以制表符分隔的

如果该列没有像
0P
0D*
这样的值,这可能会对您有所帮助:

awk 'BEGIN{FS=OFS="\t"}!$3{$3=e}{print;e=$3}' file
说明:

  • 将字段分隔符设置为“仅制表符”
  • 如果
    $3
    为空,则将
    $3
    设置为变量
    e
  • 打印行
  • 为下一条记录将变量
    e
    设置为
    $3

    • 这将处理文件中的所有字段

      awk'
      开始{FS=OFS=“|”}
      {
      
      对于(i=1;这对第2列有效,我正在用第3列测试如何推广你的解决方案现在检查我的更通用的解决方案。你可以通过
      c=3
      来填充第3列而不是第2列。这也很有效,简单而优雅,谢谢^1这在任何awk中都是一样的,没有什么特别的问题。哦,是的,你是对的t、 三对gnu AQK来说并没有什么特别之处,不过它似乎并没有改变anything@doktorcaligari你确定你的输入文件和你在问题中写的一样是用制表符分隔的吗?我得到了你写的确切输出。但是我必须转换你的源文件,因为你用空格而不是制表符。哦,对不起,你说得对,我说的是制表符delimited,这是一个输入错误,我的意思是“字段分隔”(带|),我的错误是我将更正该问题以供将来参考,如果$3的数值计算为0,则该问题将失败