Mar*_*zko 4 awk text-processing
我正在制作一个巨大的文件,其中包括这样的部分:
~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~ Gradients ~~~~~~~~
~~~~~~~~~ x y z ~~~~~~~~~~
~ ~
~ H 1 0.00781 0.00108 0.00038 ~
~ H 2 0.01271 -0.01507 0.02839 ~
~ C 1 -0.05015 -0.01803 0.01588 ~
~ O 1 0.01733 0.03089 -0.04611 ~
~ O 2 0.01230 0.00114 0.00147 ~
~ ~
~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我需要提取这些数字(xyz):
0.00781 0.00108 0.00038
0.01271 -0.01507 0.02839
-0.05015 -0.01803 0.01588
0.01733 0.03089 -0.04611
0.01230 0.00114 0.00147
Run Code Online (Sandbox Code Playgroud)
我写了以下脚本:
awk '/z ~/ {for(i=1; i<=6; i++) {getline; print $4, $5, $6}}' filename
Run Code Online (Sandbox Code Playgroud)
但是由于“〜〜”行,它给了我一个空行。
换句话说,每次找到/z ~/
模式时,我都想跳过另一行(模式+1),只打印其他五行(模式+2+3+4+5+6)的内容。当然,它需要是一个重复的操作(一遍又一遍,数十万次)。
awk解决方法:
awk '/z ~/{ n=NR+2 }n && n<=NR && NR<(n+5){ print $4,$5,$6 }' file | column -t
Run Code Online (Sandbox Code Playgroud)
输出:
0.00781 0.00108 0.00038
0.01271 -0.01507 0.02839
-0.05015 -0.01803 0.01588
0.01733 0.03089 -0.04611
0.01230 0.00114 0.00147
Run Code Online (Sandbox Code Playgroud)
NR
- 当前记录号
n=NR+2
-n
这里指向模式行后的“起始”行号