gpt4 book ai didi

bash - 将 bash 变量传递给 awk 以提取特定位置的字符

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

我正在使用此命令从字符串的某些位置提取字符:

left=1; right=4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | tail -n 1 | awk '{print substr($0,1,4)}'

并获得正确的输出:

GTTG

现在我想用 bash 变量 leftright 中的值替换 14

我试过这个:

left=1; right=4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | tail -n 1 | awk -v l=$left r=$right '{print substr($0,l,r)}'

awk:命令。第 1 行:致命:无法打开文件 `{print substr($0,l,r)}' 进行读取

有什么建议吗?谢谢。

编辑:从下面的评论中复制,以便我们实际阅读:

好吧,我还有一个文件,其中写了要搜索的内容(例如 ETM21CH01EPU3Z)以及在哪些位置。所以整个代码是:

while read -r line; do
echo $line;
name=`echo $line | cut -d' ' -f 1`;
left=`echo $line | cut -d' ' -f 2`;
right=`echo $line | cut -d' ' -f 3`;
grep $name -A1 SLf_454.fna | tail -n 1 | awk -v l=$left -v r=$right '{print substr($0,l,r)}';
done < CL6o_blastoutput_SLf_454.fna_out

最佳答案

@dogbane 给了你你要求的具体答案,但你不需要那么长的命令和管道链,只是在你找到某种模式后打印该行的前 4 个字符。试试这个:

left=1; right=4; awk -v l="$left" -v r="$right" 'f{print substr($0,l,r);f=0} /ETM21CH01EPU3Z/{f=1}' SLf_454.fna

显然你不需要左右 shell 变量,如果这就是你使用它们的全部:

awk -v l="1" -v r="4" 'f{print substr($0,l,r);f=0} /ETM21CH01EPU3Z/{f=1}' SLf_454.fna

编辑:我将您的命令复制到您的原始问题中,以便我们阅读您的脚本。

试试这个(未经测试):

awk -F, '
NR==FNR { left[$1]=$2; right[$1]=$3; next }
{
for (name in found) {
print substr($0,left[name],right[name])
delete found[name]
}
for (name in left) {
if ($0 ~ name) {
found[name]
}
}
}
' CL6o_blastoutput_SLf_454.fna_out SLf_454.fna

关于bash - 将 bash 变量传递给 awk 以提取特定位置的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14585483/

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