Как извлечь значения из этих данных, используя bash и awk? - PullRequest
2 голосов
/ 19 марта 2010

Я сгреб их, как мне извлечь значения?

...
cavity_2mgl_wt_strip57001.out: Total cavity volume (A3)               : (  1.240E+01) 
cavity_2mgl_wt_strip58001.out: Total cavity volume (A3)               : (  2.408E+00) 
cavity_2mgl_wt_strip60001.out: Total cavity volume (A3)               : (  4.935E+00) 
cavity_2mgl_wt_strip61001.out: Total cavity volume (A3)               : (  1.319E+00) 
cavity_2mgl_wt_strip63001.out: Total cavity volume (A3)               : (  1.532E-01) 
cavity_2mgl_wt_strip64001.out: Total cavity volume (A3)               : (  1.137E+01) 
...

и мне нужен индекс # в имени файла, выделенный жирным шрифтом:

cavity_2mgl_wt_strip<b>76001</b>.out: Total cavity volume (A3)               : (  1.276E+01)

и мне нужен номер в скобках:

cavity_2mgl_wt_strip76001.out: Total cavity volume (A3)               : (  <b>1.276E+01</b>)

Ответы [ 5 ]

6 голосов
/ 19 марта 2010
$ ..<commands>.. | awk -F"[:)(]" '{gsub(".*strip|.out","",$1);print $1,$(NF-1)}' 
57001   1.240E+01
58001   2.408E+00
60001   4.935E+00
61001   1.319E+00
63001   1.532E-01
64001   1.137E+01

или если ваши собранные значения уже находятся в файле

$ awk -F"[:)(]" '{gsub(".*strip|.out","",$1);print $1,$(NF-1)}' file
2 голосов
/ 19 марта 2010
sed 's/.*strip\(.*\).out.*(\([^:].*\))/\1 \2/' file
1 голос
/ 19 марта 2010

В чистом виде:

while read line; do
   tmp="${line#*strip}"; index="${tmp%.out*}"
   tmp="${line##*(}";    value="${tmp%)*}"
   printf "%s:%s\n" "$index" "$value"
done < file
1 голос
/ 19 марта 2010

Как насчет использования sed?

sed -e 's/.*strip\([^.]*\).*( *\([^ )]*\) *).*/\1 \2/' infile > outfile

Первый снимок - это часть линии между «полосой» и следующей точкой. Затем строка до последнего открывающего кронштейна пропускается. Второй захват - это число (с удаленным пробелом в начале и в конце) между последней парой скобок.

1 голос
/ 19 марта 2010

Конечно, в Perl намного короче, чем в awk. Я не знаю, насколько гибкий ваш формат; Я на всякий случай вставил несколько символов подстановки:

perl -ne 'if ($_ =~ /cavity_[0-9]+mgl_wt_strip([0-9]+)\.out:[^:]+: *\( *([0-9]+\.[0-9]+E[+-][0-9]+)\)/) {print "$1 $2\n"}' in.txt > out.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...