Как извлечь значение по имени из «имя значение имя значение ...» - как строки ввода - PullRequest
1 голос
/ 29 марта 2011

Рассмотрим поток строк, переданных в awk.Строки состоят из последовательности чередующихся имен полей и значений полей, как показано в следующем примере (строки действительно намного длиннее со многими другими перечисленными атрибутами):

Образцы 2978 Мин. -0.068689 при 1389 Амин 1.0406e-08 при 435 Макс. 0,0514581 при 1375
Образцы 2977 Мин. -0,100258 при 1293 Амин -1,06743e-08 при 3 Макс. 0,0989735 при 1282
Образцы 2977 Мин. -0,109783 при 1281 Амин -2,97293e-08 при 10 Макс. 0,139651 при1268
Образцы 2976 Мин. -0,116509 при 1269 Амин -1,04306e-09 при 161 Макс. 0,0985577 при 1255

Я хотел бы извлечь определенное значение из строк, используя его имя в качестве ориентиранапример, Min.Если бы у меня была scanf -подобная функция в awk, я бы сначала использовал ind=index($0, "Min"), затем s=substr($0, ind), затем sscanf(s,"Min %f", &val), чтобы получить val.Тем не менее, у меня нет scanf доступных в awk.

Как я могу извлечь значение по его имени тогда?

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Вы просматриваете каждое поле, проверяете «Мин» и затем извлекаете следующее поле

$ 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 голос
/ 29 марта 2011

\ 1.Разве вы не можете полагаться на то, что элементы данных находятся в одной и той же позиции столбца в каждой записи?Тогда вы можете просто сказать

awk '{print $3}' dataFile

, чтобы получить значение Min для вашего примера.

\ 2.Идея Куруми прекрасна.

\ 3.Вот еще один метод, который гарантирует, что вы сопоставляете данные с их меткой

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

. Вы можете вносить изменения непосредственно в $ 0, но поскольку awk «пересчитывает» значения полей каждый раз, когда редактируется $ 0, это произойдет (по моему опыту)) гораздо более медленный процесс.

Надеюсь, это поможет.

0 голосов
/ 29 марта 2011

Сканирует по полям только те строки, которые содержат метку.

BEGIN {a="^Min$"}

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

->

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

работает на ideone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...