AWK将null列替换为上一行列值
我有一系列具有不同列宽的字段分隔文件(符号|): 文件1:AWK将null列替换为上一行列值,awk,Awk,我有一系列具有不同列宽的字段分隔文件(符号|): 文件1: 2p | 2P* | 1/2 | 2 | 10.19880615024 | 2s | 2S | 1/2 | 2 | 10.19881052514816 | 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 |
文件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,则该问题将失败