gpt4 book ai didi

regex - 当一个模式是 bash/awk 中的变量时如何在两种模式之间取线(动态正则表达式)

转载 作者:行者123 更新时间:2023-11-29 09:25:05 25 4
gpt4 key购买 nike

我在尝试结合我对dynamic regular expressions的理解与 awk's ability to print lines between two patterns为了获得可能是 bash 变量的两个模式之间的线。在此特定实例中,第一个模式是 bash 变量,另一个模式是随后出现的以“>”开头的通配符。数据看起来像这样:

CGCGCGCGCGCGCGCGCGCGCGCG
>jcf719000004955 0-783586
ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT
>jcf_anything 0-999999
TATATATATATATATATATATATA
TATATATATATATATATATATATA

我只想获得:

ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT

因此,使用这些变量:

i="jcf719000004955"
data="/bin/file"

这些匹配模式都不起作用:

awk '/^\>$i/{f=1;next} /^\>.*/{f=0} f' $data
awk '/^\>$i/{f=0} f; /^\>.*/{f=1}' $data

我能够使用动态正则表达式来获取包含我的 bash 变量的匹配模式:

awk -v var="$i" '$0 ~ var ' $data | head -1
>jcf719000004955 0-783586

但是我如何结合使用动态正则表达式以获得两个变量/模式之间的线条?

最佳答案

您可以使用以下 gawk 命令:

i=jcf719000004955; awk -v var="$i" '$0~"^>"var{f=1; next}/^[^>]/{if(f)print;next}/^>/{if(f)exit}' input.txt

输入:

CGCGCGCGCGCGCGCGCGCGCGCG
>jcf719000004955 0-783586
ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT
>jcf_anything 0-999999
TATATATATATATATATATATATA
TATATATATATATATATATATATA

输出:

ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGT

解释:

  • -v var="$i" 这是为了将一个 shell 变量传递给您的 awk 命令,以便在您的 awk 脚本中访问它。
  • awk 中默认变量初始化为 0

awk 脚本:

# Rule(s)

$0 ~ ("^>"var) { #when the line starts with > and the value of your shell variabl
f = 1 #set f to 1
next #go to next line
}

/^[^>]/ { #when the line does not start with a >,
if (f) { #check if f is equal to 1
print $0 #if it is the case it prints the whole line on your stdrout
}
next # jump to next line
}

/^>/ { #if we reach this point, it means that the line starts with > but has another value that what is stored in your variable so we reset
if(f) { #if f was at 1 we have already passed by the printing section and we can exit
exit
}
}

测试结果:

enter image description here

关于regex - 当一个模式是 bash/awk 中的变量时如何在两种模式之间取线(动态正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48377526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com