awk перехватывает текст, идущий в следующую строку - PullRequest
4 голосов
/ 02 ноября 2010

У меня есть следующая проблема, может быть, вы можете помочь:

Текст, который я хочу сопоставить, выглядит следующим образом:

Data Generated using Turbine's method
Stuff
more Stuff
Full speed : 0.87
Data generated using My method
Stuff
more stuff
Full speed : 0.96

Data Generated using Turbine's method
Stuff
more Stuff
Full speed : 0.83
Data generated using My method
Stuff
more stuff
Full speed : 0.94

Я хочу сопоставить строки, содержащие полную скорость ивыведите их в таблицу следующим образом:

Turbine's My
0.87    0.96
0.83    0.94

, чтобы я мог сравнить два метода.Однако у меня возникают проблемы с получением awk, чтобы соответствовать моему текущему регулярному выражению:

/Data Generated using Turbine's method.*Full speed/
/Data Generated using My method.*Full speed/

В чем конкретно заключается моя проблема?Почему awk не соответствует этому?

спасибо за совет

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Один RE в AWK пытается сопоставить только одну строку. Вы, кажется, хотите шаблон диапазона, что-то вроде: /^Data Generated/, /^Full Speed.*$/.

Редактировать: получить именно тот формат, который вы просили, относительно сложно. Если вы не возражаете, так сказать, повернуть его вбок, чтобы каждый набор был в строке, а не в столбце, он становится проще:

/^Data/     { name = $4; }
/^Full/     { speeds[name] = speeds[name] " " $4; } 

END { 
    for (i in speeds)
        printf("%10s : %s\n", i, speeds[i]);
}
2 голосов
/ 02 ноября 2010

Попробуйте:

awk -F: 'BEGIN {OFS="\t"; print "Turbine\047s" OFS "My"} /Turbine/ {tflag=1; mflag=0} /My/ {mflag=1; tflag=0} /Full speed/ {if (tflag) {T=$2; tflag=0}; if (mflag) { print T OFS OFS $2; mflag=0}}' inputfile

В отдельных строках:

awk -F: 'BEGIN {OFS="\t"; print "Turbine\047s" OFS "My"}
        /Turbine/ {tflag=1; mflag=0}
        /My/ {mflag=1; tflag=0}
        /Full speed/ {
            if (tflag) {T=$2; tflag=0}; 
            if (mflag) { print T OFS OFS $2; mflag=0}}' inputfile

Или несколько более простая версия:

awk -F: '/Turbine/, /^Full speed/ {if ($0 ~ /Full/) T=$2}
         /My/, /^Full speed/ {if ($0 ~ /Full/) print T, $2}'
0 голосов
/ 02 ноября 2010

Я бы использовал Perl:

perl -ne '
    if (/(\S+) method/) {$method = $1}
    if (/Full speed : ([\d.]+)/) {push @{$speeds{$method}}, $1}
    END {
        @keys = keys %speeds;
        print join("\t", @keys), "\n";
        $max = 0;
        for $v (values %speeds) {
            $len = scalar @$v; 
            $max = $len if $len > $max;
        }
        for $i (0 .. $max-1) {
            for $k (@keys) {print $speeds{$k}[$i], "\t"}; 
            print "\n";
        }
    }
' speed.txt

, который выводит

My      Turbine's
0.96    0.87
0.94    0.83
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...