Вызов оболочки из awk невероятно медленный - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу обработать значение в awk на ходу. Значение обрабатывается через двоичный файл. Я пытаюсь сделать это следующим образом, но это слишком медленно. Неприменимо медленно. 5 миллионов записей без этой обработки заканчиваются за 30 секунд. С этим - я ждал несколько часов без конечного результата.

Я что-то не так делаю? Есть ли правильный способ обработки значения в awk с помощью внешнего приложения?

bash call

#!/bin/bash
...    
cat ${INFILE} | awk -F"\t" -v sh_dir="${DIRECTORY_PATH_SH}" outfile="${OUTFILE}" -f process.awk

process.awk

{   
    cmd=sh_dir"/sha_cipher"
    print $2 |& cmd
    close(cmd, "to")
    cmd |& getline encrypted_id
    close(cmd)

    printf "%s\t%s\t%s\n", $1, encrypted_id, $19 >> outfile
}

ВХОД:

2018-09-14 | AlexOrange | 15 | HTTP | 86914702 | 1 | 1 | НЕТ | 79634 | 48249 | 127883 | ВЛЕВО | МОДЕЛЬ1 | SUBTYPE255 A536 | RS | SO | 94 | Эликсир | RTT

ВЫВОД:

2018-09-14 | 36c8387b7e334c38786d6d497b | RTT

1 Ответ

0 голосов
/ 14 сентября 2018

У меня нет sha_cipher на моем ПК, но давайте представим, что ваша команда оболочки была tr 'a-z' 'A-Z' вместо sha_cipher. Взгляд (ввод через табуляцию):

$ cat file
2018-09-14      AlexOrange      15      HTTP    86914702        1       1       NO      79634   48249   127883  LEFT    MODEL1  SUBTYPE255 A536 RS      SO      94     Elixir   RTT
2018-09-14      Joe Bloggs      15      HTTP    86914702        1       1       NO      79634   48249   127883  LEFT    MODEL1  SUBTYPE255 A536 RS      SO      94     Elixir   RTT
2018-09-14      Sue Everyone    15      HTTP    86914702        1       1       NO      79634   48249   127883  LEFT    MODEL1  SUBTYPE255 A536 RS      SO      94     Elixir   RTT

$ cut -f2 file | tr 'a-z' 'A-Z'
ALEXORANGE
JOE BLOGGS
SUE EVERYONE

$ cut -f2 file | tr 'a-z' 'A-Z' |
awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[NR]=$0;next} {print $1, a[FNR], $19}' - file
2018-09-14      ALEXORANGE      RTT
2018-09-14      JOE BLOGGS      RTT
2018-09-14      SUE EVERYONE    RTT

Это будет на несколько порядков эффективнее, чем запуск awk подоболочки для вызова команды оболочки один раз для каждой строки ввода, при условии, что sha_cipher может работать с несколькими значениями в конвейерном вводе, такими как tr и большинством других текстов. -обработка команд оболочки может (вырезать, sed, grep, sort, uniq и т.д ...).

Для проверки синхронизации я создал файл с 5 миллионами строк в том же формате, что и предоставленная вами строка ввода образца, и содержащий случайные строки во 2-м поле с помощью:

$ cat file
2018-09-14      AlexOrange      15      HTTP    86914702        1       1       NO      79634   48249   127883  LEFT    MODEL1  SUBTYPE255 A536 RS      SO      94     Elixir   RTT

$ tr -dc '[:alnum:]' </dev/urandom | fold -w 6 | head -5000000 |
awk 'BEGIN{FS=OFS="\t"} NR==FNR{orig=$0;next} {x=$0; $0=orig; $2=x}1' file - > file5m

$ wc -l file5m
5000000 file5m

$ head -3 file5m
2018-09-14      fLSynM  15      HTTP    86914702        1       1       NO      79634   48249   127883  LEFT    MODEL1  SUBTYPE255 A536 RS      SO      94      Elixir RTT
2018-09-14      mxWzLF  15      HTTP    86914702        1       1       NO      79634   48249   127883  LEFT    MODEL1  SUBTYPE255 A536 RS      SO      94      Elixir RTT
2018-09-14      EKJYF8  15      HTTP    86914702        1       1       NO      79634   48249   127883  LEFT    MODEL1  SUBTYPE255 A536 RS      SO      94      Elixir RTT

и вот результат запуска предложенного решения на нем:

$ time cut -f2 file5m | tr 'a-z' 'A-Z' | awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[NR]=$0;next} {print $1, a[FNR], $19}' - file5m > outFile5m
real    0m40.892s
user    0m42.196s
sys     0m0.980s

$ wc -l outFile5m
5000000 outFile5m

$ head -3 outFile5m
2018-09-14      FLSYNM  RTT
2018-09-14      MXWZLF  RTT
2018-09-14      EKJYF8  RTT

Так что, если sha_cipher не намного менее эффективен, чем tr 'a-z' 'A-Z' (если это так, то вам просто не повезло), тогда я ожидаю, что вышеупомянутое должно работать достаточно быстро для вас (то есть, оно должно работать менее чем за минуту, а чем несколько часов).

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