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