Больше входных файлов в awk - PullRequest
1 голос
/ 23 марта 2019

У меня есть код:

/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { in_f_format=0; next } 
{sum2+=$2; sum3+=$3} END{printf("%.6f\n",sum3/sum2)}

Это найти таблицу в текстовом файле и обеспечить вычисление. В результате получается одно число из одного файла. Как получить столбец результатов для большего количества файлов. Я написал:

awk -f program.awk file??.txt

и я получаю только один результат - для file01.txt

Входной файл01

    Curve     No. of obs.   Sum of squares
      1           82        0.81604656
      2         7200    96272.93714063
      3         7443   110384.79793831

jkjl

Входной файл02

    Curve     No. of obs.   Sum of squares
      1           82        0.81604656
      2         7200    96272.93714063
      3         7443   110384.79793831

jkjl

Желаемый ввод - два числа в случае двух входных файлов.

14.034536
14.034536

1 Ответ

4 голосов
/ 23 марта 2019
awk '
FNR==1{argind++}                          # if you are on GNU awk, remove this and...
/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { in_f_format=0; next } 
{sum2[argind]+=$2; sum3[argind]+=$3}      # ... replace argind with ARGIND here
END{
    for(i=1;i<=argind;i++)                # ... and here.
        printf("%.6f\n",sum3[i]/sum2[i])
}' file1 file2

Вывод:

14.034537
14.034537

Если вы используете GNU awk, вы можете заменить argind на встроенный ARGIND и удалить блок FNR==1.

Обновление :

Если вы используете GNU awk, вы можете использовать ENDFILE:

$ awk '/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { in_f_format=0; next } 
{sum2+=$2; sum3+=$3} 
ENDFILE {                                   # ENDFILE after every file
    printf("%.6f\n",sum3/sum2)              # print 
    sum3=sum2=0                             # reset vars
}' file file                                # all those files
14.034537
14.034537

Еще одно обновление :

Или вы можете переместить printf и удалить блок END:

$ awk '/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { 
    in_f_format=0
    printf("%.6f\n",sum3/sum2)               # move it here
    sum2=sum3=0                              # reset vars
    next
} 
{sum2+=$2; sum3+=$3}' file file
14.034537
14.034537
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...