Я хотел написать сценарий awk без for
зацикливания столбцов, чтобы сравнить время выполнения с for
зацикленным решением, таким как тривиальное @ oguzismail.Я создал миллион записей из 1-100 столбцов данных, значения между 0-2 ^ 32.Я играл с RS
, чтобы сравнивать только столбцы 2-100, но, поскольку это требовало регулярных выражений, это замедляло выполнение.Многое.Используя tr
для обмена пробелами и символами новой строки, я довольно близко подошел:
$ cat <(echo 0) file | tr ' \n' '\n ' | awk 'max<$1{max=$1}END{print max}'
Вывод cat <(echo 0) file | tr ' \n' '\n '
:
0 string1
1250117816
3632742839
172403688 string2
2746184479
...
Использовано тривиальное решение :
real 0m24.239s
user 0m23.992s
sys 0m0.236s
тогда как мой tr
+ awk потратил:
real 0m28.798s
user 0m29.908s
sys 0m2.256s
(удивительно, если я сначала предварительно обработал данные с помощью tr
в файл, а затем прочитал их с помощью awk itне будет быстрее, в большинстве случаев на самом деле медленнее)
Итак, я решил проверить свои ржавые навыки C, чтобы установить какой-то базовый уровень (справочные страницы довольно хороши. И Google.):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE * fp;
char * line = NULL;
char * word = NULL;
size_t len = 0;
ssize_t read;
long max=0;
long tmp=0;
fp = fopen("file", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1) {
if((word = strtok(line," "))!=NULL) {
while(word != NULL) {
if((word = strtok(NULL," "))!=NULL) {
tmp=strtol(word,NULL,10);
if(max<tmp) {
max=tmp;
}
}
}
}
}
fclose(fp);
printf("%ld\n",max);
exit(EXIT_SUCCESS);
}
Результат этого:
$ time ./a.out
4294967292
real 0m9.307s
user 0m9.144s
sys 0m0.164s
О, использование mawk вместо gawk почти вдвое уменьшило результаты.