Использование awk в скрипте bash для выбора диапазона строк на основе количества символов в конкретной строке - PullRequest
0 голосов
/ 27 февраля 2019

Это похоже на то, что может быть возможно в одной длинной команде awk.Но я не знаю достаточно хорошо, чтобы сделать это.

Я хочу определить общее количество символов A, T, G и C в каждой 4-й строке ввода,начиная со строки 2. Если любой номер строки, кратный 4, имеет количество символов в диапазоне, скажем, от 1000 до 3000, то я хочу, чтобы он напечатал эту строку, а также строку выше и две строки ниже.

Я могу разбить его на части и разбить на части в отдельных строках кода.Но когда у меня миллионы строк, вычисление занимает слишком много времени.Мне нужна одна мощная команда awk здесь.В awk должен быть кто-то достаточно блестящий, чтобы решить этот вопрос!

Очень крошечный пример с диапазоном 10 < character count < 40:
Ввод:

@d0aec33d-ba    
TCAGTATGCTTCGTGCAATCAAG    
+    
-0(''$&"('    
@ee487ad3-b71    
ACAATGTG    
+    
""%#0&'+367<677

Вывод:

@d0aec33d-ba    
TCAGTATGCTTCGTGCAATCAAG    
+    
-0(''$&"('    

1 Ответ

0 голосов
/ 27 февраля 2019

Вот быстрый:

$ awk '
NR%4==1 { b="" }                                # first record of four, reset buffer
NR%4==2 && length()>10 && length()<40 { f=1 }   # 2/4 if length is right, flag up
{ b=b $0 ORS }                                  # buffer records to b
NR%4==0 && f {                                  # 4/4 
    printf "%s",b                               # print if flag is up
    f=0                                         # and flag down
}' file                 

Вывод:

@d0aec33d-ba
TCAGTATGCTTCGTGCAATCAAG
+
-0(''$&"('

Редактировать :

Параметризованная версия (x=$min, y=$max):

$ awk -v x=$min -v y=$max '
NR%4==1 { b="" }                                # first record of four, reset buffer
NR%4==2 && length()>x && length()<y { f=1 }     # 2/4 if length is right, flag up
{ b=b $0 ORS }                                  # buffer records to b
NR%4==0 && f {                                  # 4/4 
    printf "%s",b         #                     # print if flag is up
    f=0                 # #                     # and flag down
    # printf b; f=0   # # # # # # # # # # # # # # if commands on the same line                        
}' file                 # #
                          #

Однострочник на всякий случай:

$ awk -v x=$min -v y=$max 'NR%4==1{b=""} NR%4==2 && length()>x && length()<y{f=1} {b=b $0 ORS} NR%4==0 && f{printf "%s",b; f=0}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...