这似乎是在单个long awk命令中可能实现的功能。但是我不知道该怎么做。
我想确定从第2行开始的每4行输入中A
,T
,G
和C
个字符的总数数字是4的倍数,其字符数在1000到3000之间,那么我希望它打印该行以及上一行和下两行。
我可以分解它,并在单独的代码行中进行部分操作。但是,当我有数百万行时,计算将花费很长时间。我在这里需要一个功能强大的awk命令。 awk必须有足够聪明的人来解决这个问题!
一个非常小的例子,范围为10 < character count < 40
:
输入:
@d0aec33d-ba
TCAGTATGCTTCGTGCAATCAAG
+
-0(''$&"('
@ee487ad3-b71
ACAATGTG
+
""%#0&'+367<677
输出:
@d0aec33d-ba
TCAGTATGCTTCGTGCAATCAAG
+
-0(''$&"('
答案 0 :(得分:3)
这是一个快速的例子:
$ 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