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

2024-05-14 04:08:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从名为multicolumn file中提取一些数据质量.mas03。列由tab分隔。当数据开始时,您可以看到有一些条目是空的(即第44行和第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,但这是一个大文件,我正在尝试自动化一点整个过程。你知道吗

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


Tags: 文件数据质量条目libetabmass
3条回答

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

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

其中f.awk是:

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

如果您的数据是真正的制表符分隔的,那么您只需使用:

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

如果是固定宽度字段,则应使用:

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

例如:

$ 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的。我不知道这些是否是正确的领域宽度或不是你的数据,我只是做了一个大概的估计,以证明该方法。显然,如果您想将其从字段固定转换为制表符分隔,那么这样做很简单:

$ 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

对我来说,文件的结构仍然是从一个点开始到另一个点结束 特定字段的字符数总是相同的 所以它是一个固定宽度的字段

7美元起价35美元,宽度12美元

使用awk'/Li/{print substr($0,35,12)}'质量.mas03你知道吗

相关问题 更多 >