Выборка Start & END файла с AWK поражает производительность - PullRequest
1 голос
/ 31 марта 2020

Попытка разделить начало от середины до середины конца файла. Кодирование с помощью команды END ухудшает производительность скрипта, и, как правило, занимает больше времени и start_pos is hardcoded to 1. Какой должен быть лучший способ сделать это.

Primarily three questions: 1. Вместо жесткого начального положения в 1, что будет более эффективным способом начать с 1-го положения 2. Вместо жесткого кодирования конечной позиции до END, что будет более эффективным способом начать с 1-й позиции 3. Определение позиции END файла, вызывающего команду END, приведет к исполнению? ``

Код начального позиционирования: awk 'NR>= v1 & & NR<=v2' v1="${start_pos}" v2="${mid_pos}" file

Код конечного положения: awk 'NR>= v3 & & NR<=v4' v3="${next_mid}" v4="END" file

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Если вы просто хотите напечатать диапазон строк, awk - это перебор. Использование sed:

sed -n "${start_pos},${mid_pos}p; ${next_mid},\$p" file

Если вы не хотите печатать строки от next_mid до конца файла, а где-то до конца, используйте переменную числа четвертой строки:

sed -n "${start_pos},${mid_pos}p; ${next_mid},${next_end}p; ${next_end}q" file
0 голосов
/ 31 марта 2020

Самый быстрый способ нарезки файла следующий:

awk 'FNR>n{exit}(FNR>=m)' m=5 n=10 file

Если вы хотите сделать это возможным, метод является обобщенным c и также работает с «КОНЕЦ» файла, вы может сделать:

awk '(FNR<m){next}1;(FNR==n){exit}' m=5 n=10 file       # cut line 5 to 10
awk '(FNR<m){next}1;(FNR==n){exit}' m=5 n="EOF" file    # cut line 5 till EOF
awk '(FNR<m){next}1;(FNR==n){exit}' m=5 n=-1 file       # cut line 5 till EOF
awk '(FNR<m){next}1;(FNR==n){exit}' m=1 n=10 file       # cut line 1 till 10
awk '(FNR<m){next}1;(FNR==n){exit}' m=1 n=10 file       # cut line "BOF" till 10

Причина, по которой это работает, заключается в том, что строки конвертируются в цифру c НОЛЬ при использовании с оператором нумерации c, таким как "< или == (последний цифра c, поскольку FNR является целым числом.


FNR: номер записи текущего файла next: прекратить обработку этой записи и перейти к следующей записи в файле exit: прекратить любую обработку файла и выполнить инструкцию END, если она доступна (здесь их нет)

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