gpt4 book ai didi

AWK 用前一行的列值替换空列

转载 作者:行者123 更新时间:2023-12-04 15:07:11 26 4
gpt4 key购买 nike

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

文件 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 |

文件 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 |

我想用上面最后一个非 NULL 列中的相应值填充第二列中的空白:文件 2 示例:

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 |

这个问题与here中的问题类似我可以在第一列中通过以下命令使用 awk 执行此操作:

awk -F"|"'/^/{$0=(x)substr($0,length(x)+1)}{x=$1}1' "$file"

但是我的知识不足以使其在第二列(或与此相关的任何任意列)中工作。

有人可以帮忙吗?提前致谢!

最佳答案

以您的 file2 为例,您可以使用此 awk 命令:

awk -v c=2 'BEGIN {FS=OFS="|"} $c ~ /^[ \t]*$/ {$c = p} {p = $c} 1' file

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 |

要填充第 3 列,只需传递 c=3 代替 c=2

关于AWK 用前一行的列值替换空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65905996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com