考虑通过管道传输到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
。
如何通过它的名称提取值呢?
答案 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
运行