我正在尝试从名为 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
,但它是一个大文件,我试图在整个过程中自动化。
对于这个奇怪的列文件,有没有办法“选择”所需数据并对它们应用一些简单的计算?
答案 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