如何从“名称值名称值...”中按名称提取值 - 如输入行

时间:2011-03-29 03:33:56

标签: awk

考虑通过管道传输到awk的线条流。行由交错的字段名称和字段值组成,如下例所示(行确实更长,列出了许多其他属性):

  

样品2978 Min -0.068689 at 1389 Amin 1.0406e-08 at 435 Max 0.0514581 at 1375
  样品2977 Min -0.100258 at 1293 Amin -1.06743e-08 at 3 Max 0.0989735 at 1282
  样品2977 Min -0.109783 at 1281 Amin -2.97293e-08 at 10 Max 0.139651 at 1268
  样品2976 Min -0.116509 at 1269 Amin -1.04306e-09 at 161 Max 0.0985577 at 1255

我想使用它的名称作为指南从字符串中提取某个值,例如Min。如果我在scanf中有类似awk的功能,我首先使用ind=index($0, "Min"),然后使用s=substr($0, ind),然后使用sscanf(s,"Min %f", &val)来获取val }}。但是,我在awk中没有任何scanf

如何通过它的名称提取值呢?

3 个答案:

答案 0 :(得分:2)

您浏览每个字段,检查“Min”然后提取下一个字段

$ awk '{for(o=1;o<=NF;o++) if ($o =="Min" ) {print $(o+1)} }' file
-0.068689
-0.100258
-0.109783
-0.116509

红宝石(1.9 +)

$ ruby  -ne 'puts $_.scan(/Min\s+(.[^\s]*)/)' file

答案 1 :(得分:1)

\ 1。您是否可以依赖数据元素在每个记录中的相同列位置?然后你可以简单地说

awk '{print $3}' dataFile

根据您的示例获取最小值。

\ 2。 Kurumi的想法很好。

\ 3。这是另一种确保您将数据与其标签匹配的方法

awk '{
     minVal=$0
     sub(/^.*Min /, "",minVal)
     sub(/ .*$/, "", minVal)
     printf minVal" "
     maxVal=$0
     sub(/^.*Max /, "",maxVal)
     sub(/ .*$/, "", maxVal)
     printf maxVal "\n"
   } '  dataFile

您可以直接在$ 0上进行修改,但由于每次编辑$ 0时awk“重新计算”字段值,(根据我的经验)这将是一个慢得多的过程。

我希望这会有所帮助。

答案 2 :(得分:0)

这将仅按字段扫描包含标签的行。

BEGIN {a="^Min$"}

/a/   {for(i = 1; i <= $NF; i++) { if (match($i,a)) print $i,$(i+1)}}     

- &GT;

Min -0.068689
Min -0.100258
Min -0.109783
Min -0.116509

ideone

运行