在 bash 脚本中使用 awk 到 select 行范围基于特定行中的字符数
Using awk in a bash script to select line range based on number of characters in specific line
这似乎可以在单个长 awk 命令中实现。但是我对 awk 的了解还不够。
我想在输入的每 4 行中识别 A
、T
、G
和 C
个字符的总数,从第 2 行开始。如果任何 4 的倍数的行号,其字符数在 1000 到 3000 范围内,然后我希望它打印该行以及上面的行和下面的两行。
我可以将其分解并在单独的代码行中执行部分操作。但是当我有数百万行时,计算时间太长。我在这里需要一个强大的 awk 命令。一定有 awk 高手来解决这个问题!
非常小的示例,范围为 10 < character count < 40
:
输入:
@d0aec33d-ba
TCAGTATGCTTCGTGCAATCAAG
+
-0(''$&"('
@ee487ad3-b71
ACAATGTG
+
""%#0&'+367<677
输出:
@d0aec33d-ba
TCAGTATGCTTCGTGCAATCAAG
+
-0(''$&"('
这是一个快速的:
$ 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 [=10=] 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 [=12=] 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 [=13=] ORS} NR%4==0 && f{printf "%s",b; f=0}' file
这似乎可以在单个长 awk 命令中实现。但是我对 awk 的了解还不够。
我想在输入的每 4 行中识别 A
、T
、G
和 C
个字符的总数,从第 2 行开始。如果任何 4 的倍数的行号,其字符数在 1000 到 3000 范围内,然后我希望它打印该行以及上面的行和下面的两行。
我可以将其分解并在单独的代码行中执行部分操作。但是当我有数百万行时,计算时间太长。我在这里需要一个强大的 awk 命令。一定有 awk 高手来解决这个问题!
非常小的示例,范围为 10 < character count < 40
:
输入:
@d0aec33d-ba
TCAGTATGCTTCGTGCAATCAAG
+
-0(''$&"('
@ee487ad3-b71
ACAATGTG
+
""%#0&'+367<677
输出:
@d0aec33d-ba
TCAGTATGCTTCGTGCAATCAAG
+
-0(''$&"('
这是一个快速的:
$ 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 [=10=] 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 [=12=] 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 [=13=] ORS} NR%4==0 && f{printf "%s",b; f=0}' file