Python 从非列文件中提取数据(在awk中)

Python 从非列文件中提取数据(在awk中),python,perl,apache-flex,awk,grep,Python,Perl,Apache Flex,Awk,Grep,我试图从非列文件中提取一些特定值。这些文件具有相同的格式 16O ADOPTED LEVELS, GAMMAS 1993TI07 93NP 199902 16O L 0.0 0+ STABLE 16O 2 L ISPIN=0

我试图从非列文件中提取一些特定值。这些文件具有相同的格式

 16O     ADOPTED LEVELS, GAMMAS        1993TI07                  93NP     199902
 16O   L 0.0          0+               STABLE                                   
 16O 2 L ISPIN=0                                                                
 16O 3 L XREF=ABCDEFHIJKLMNOPQ                                                  
 16O   L 6049.4    10  0+              67 PS     5                              
 16O 2 L ISPIN=0                                                                
 16O 3 L XREF=ABCEFIJKMP                                                        
 16O   G 6048.2    10          [E0]                             100             
 16O   L 6129.89   4   3-              18.4 PS   5                              
 16O 2 L ISPIN=0$ MOMM1=+1.668 12 (1989RA17)                                    
 16O 3 L XREF=ABCEFHIJKLNOPQ                                                    
 16O   G 6128.63   4  100      [E3]                                             
 16O 2 G BE3W=13.5 7                                                            
我对序列
16O L
后的值感兴趣。例如0.0、6049.4、6129.89等。通常,我要从这些文件中提取的值位于序列
(数字)(元素)(空格)L(空格)
之后

棘手的是,如果
(元素)
由一个字母组成,则有3个空格。如果
(元素)
由两个字母组成,则有两个空格。下面是一个示例文件

 10BE    ADOPTED LEVELS, GAMMAS        2004TI06                  04NP     200705
 10BE  L 0.0         0+                1.51E+6 Y 4                              
 10BE2 L ISPIN=1 $ %B-=100                                                      
 10BE3 L XREF=ABDEFIJKLMNOPQSTUVWXYZabceghij                                    
 10BE cL T         from weighted average of T{-1/2}=1.51 Ma 6 (Hofmann et al.,  
 10BE2cL Nucl. Instrum. Meth. Phys. Res. |b 24-25 (1987) 276),                  
 10BE3cL T{-1/2}=1.53 Ma 5% (1993Mi26), and T{-1/2}=1.48 Ma 5% (1993Mi26).      
 10BE  L 3368.03   3 2+                125 FS    12                             
 10BE2 L ISPIN=1 $ %IT=100                                                      
 10BE3 L XREF=ABCDEFIJKLMNOPQRSTUVWXYZabceghij                                  
 10BE cL           B(E2)=52 e{+2} fm{+4} 6 (1987Ra01).                          
 10BE cL E         from {+9}Be(n,|g) (1983Ke11). Other value: 3368.34 keV {I43} 
 10BE2cL (1999Bu26).                                                            
 10BE2 L WIDTHG=3.66E-3 EV 35                                                   
 10BE  G 3367.415  30 100      E2                                               
 10BE2 G WIDTHG=3.66E-3 EV 35$BE2W=8.00 76                                      
 10BE  L 5958.39   5 2+                55 FS     LT                             
 10BE2 L ISPIN=1 $ %IT=100                                                      
 10BE3 L XREF=DFJKLMPRTUWYbeghi                                                 
 10BE cL E         from {+9}Be(n,|g) (1983Ke11). Other value: 5958.3 keV {I3}   
 10BE2cL (1969Al17).                                                            
 10BE  G 2589.999  60 90     GTM1                                               
 10BE  G 5955.9     5 10     LTE2                                               
 10BE  L 13.05E3   10                  290 KEV   130                        A   
 10BE2 L %A GT 0                                                                
 10BE3 L XREF=E                                                                 
 10BE cL E         |G: from {+7}Li({+7}Li,|a+{+6}He) (2001Cu06).
有没有办法使用
awk
获取这些值? 这类工作还有其他语言吗

我曾经

awk '/   L/ { print $3 } ' file
对于第一个文件类型(即{3spaces}L),它可以工作。我曾经

awk '/  L/ { print $3 } ' file
对于第二个文件类型(即{2spaces}L),它会给出奇怪的结果(即它在序列
(两个空格)G
之后打印值,我无法理解原因。它唯一的工作方式是使用

awk '/  L / { print $3 } ' file
(即,在L后面有一个额外的空格)。为什么第二个文件类型会出现这种情况?
有没有一种方法可以对两种文件类型都使用一个代码?

当我看到这个问题时,我认为这将是一个简单的grep行,我错了!!我用我的grep行测试了至少10次,都不起作用!最后我找到了原因。 “嘘

示例中的数据:

16O ....
我想他们是:

160 ....
看到区别了吗(

好的,这是一行:

grep -Po '^16O {3}L \K[\d.]*' file
它输出:

0.0
6049.4
6129.89
6917.1
7116.85
8871.9
9585
9844.5
10356
10957
11080
11096.7
11260
11520
11600
12049
12440
12530
....
如果您希望以您的“常规”方式:


您是在寻找“160 L”行中的值吗?如果是这种情况,这应该可以完成工作

awk '/16O   L/ { print $3 } ' filename
使用awk

awk '/[0-9]+[A-Z] {3}L / { print $3 } ' file

使用grep

grep -iPo '\d+[A-Z] {3}L \K[\d.]*' file

可能更容易使用<代码> GRP .@ DEVNLUL:<代码> GRP >我会搜索它!!!TL;Pr.Prs.一个较短的示例。非常感谢您的回答!!对不起对<代码> 0代码> VS <代码> O<代码>的不便。我应该提到它!我从来没有听说过<代码> GRP!它看起来很强大!!!问题是我使用了
grep-Po'^16O{3}L\K[\d.]*'16O.ensdf
,其中
16O.ensdf
是输入文件,但我什么也没有得到。请注意,终端在
.ensdf
文件所在的目录中是打开的。grep--version@ThanosIt的
grep(GNU grep)2.10版权(C)2011免费软件基金会,许可证GPLV3+:GNU GPL版本3或更晚。这是免费软件:你可以自由地改变和重新分配它。在法律允许的范围内,没有保证。Mike Haertel和其他人写的,看。< /代码>非常感谢你的回答!!!它真的有效!有办法使它更自动化吗?对于该格式的每个文件?每个文件都有序列
(Number)(Element)(3spaces)L(space)
。非常感谢您的回答!第一行代码不起作用。第二行和第三行工作得很好!播放了一段我使用的
awk'/L/{print$3}'文件
成功了。你的代码和我的代码有什么不同?我想写
[0-9]+[a-Z]{3}
一定有原因,但我不知道为什么……你需要感谢我投票支持它。:-)我在GNU awk v4.1中做了测试,你能通过以下命令确认你的awk版本吗:`awk--version | head-1`在Solaris中,请运行/usr/xpg4/bin/awkI我没有运行Solaris。我正在运行Linux.Ubuntu 12.04
awk '$1~/[0-9]+[A-Z]/&&$2=="L"{print $3}' file
grep -iPo '\d+[A-Z] {3}L \K[\d.]*' file