从缺少条目的多列文件中提取数据

时间:2013-12-21 12:44:49

标签: python perl awk

我正在尝试从名为 mass.mas03 multicolumn file中提取一些数据。列由tab分隔。当数据开始时,您可以看到有空的条目(即第44行VS第45行)。

整个想法是从多个行的特定列( MASS EXCESS )中提取数据,获取总和并在xy轴系统上创建一条水平线, y坐标是这些值的总和。

作为一个例子,采取第41,65,74行

  -1    0    1    1 H          7288.97050    0.00011      0.0      0.0   B-      *                1 007825.03207    0.00010
   0    4    4    8 Be         4941.672      0.035     7062.435    0.004 B- -17979.819    1.001   8 005305.103      0.037
   4    7    3   10 Li   -n   33050.581     15.124     4531.555    1.512 B-  20443.910   15.123  10 035481.259     16.236

我想这样做:7288.97050 + 4941.672 - 33050.581 = - 20819.9385。如果我使用awk命令访问数据,我将面临此问题

> awk '/8 Be/ {print $6}' mass.mas03
  4941.672 
>awk '/10 Li/ {print $6}' mass.mas03
  -n

我不知道awk是不是最好的选择,不仅要做数据选择,还要做“情节”,所以我愿意接受建议!

一个明显的解决方案是在需要时使用$7而不是$6,但它是一个大文件,我试图在整个过程中自动化。

对于这个奇怪的列文件,有没有办法“选择”所需数据并对它们应用一些简单的计算?

3 个答案:

答案 0 :(得分:2)

要使用制表符替换空格,您可以尝试以下操作:

awk -f f.awk mass.mas03 > mass.mas03.tab

其中f.awk是:

/^1N-Z/ {
    f=1
    print
    getline
    print
    next
}
f {
    gsub(/ +/,"\t")
}
{print}

答案 1 :(得分:2)

如果您的数据实际上是以制表符分隔的,那么您只需使用:

awk -F'\t' '{ whatever }'

如果它是固定宽度字段,那么你应该使用:

gawk 'BEGIN{FIELDWIDTHS="list of field widths"} { whatever }'

e.g:

$ cat file
  -1    0    1    1 H          7288.97050    0.00011
   0    4    4    8 Be         4941.672      0.035
   4    7    3   10 Li   -n   33050.581     15.124

$ gawk 'BEGIN{FIELDWIDTHS="4 5 5 5 5 5 12 12"} {print $7}' file
  7288.970
  4941.672
 33050.581

请注意,FIELDWIDTHS是特定于gawk的。我不知道你的数据是否是正确的字段宽度,我只是做了一个大概的估计来证明这种方法。显然,如果你想将它从fixed-with字段转换为制表符分隔,那么这样做是微不足道的:

$ gawk -v OFS='\t' 'BEGIN{FIELDWIDTHS="4 5 5 5 5 5 12 12"} {$1=$1}1' file
  -1        0       1       1    H                7288.97050        0.00011
   0        4       4       8    Be               4941.672          0.035
   4        7       3      10    Li      -n      33050.581         15.124

如果你想从每个字段中删除前导/尾随空格:

$ gawk -v OFS='\t' 'BEGIN{FIELDWIDTHS="4 5 5 5 5 5 12 12"} {$1=$1; gsub(/ /,"")}1' file
-1      0       1       1       H               7288.97050      0.00011
0       4       4       8       Be              4941.672        0.035
4       7       3       10      Li      -n      33050.581       15.124

答案 2 :(得分:1)

对我来说,文件仍然是为一个点开始而在另一个点结束 特定字段始终具有相同数量的字符 所以这是一个固定宽度的字段

$ 7从35开始,宽度为12

使用awk'/ Li / {print substr($ 0,35,12)}'mass.mas03