【问题标题】:How to assign a variable of repeated character using the length of another variable in AWK?如何使用AWK中另一个变量的长度来分配重复字符的变量?
【发布时间】:2020-12-31 08:05:03
【问题描述】:

我想要一个重复的变量.space 长度的变量pat,我尝试了以下命令

awk -v pat="AAGCTT" -v rep=$("printf '.%.0s' length(pat)")
awk -v pat="AAGCTT" -v rep=$("printf '.%.0s' {1..length(pat)}")

some actions using both pat & rep as variable

但是输出如下错误

printf '.%.0s' {1..length(pat)}: command not found

如何生成我想要的变量?

【问题讨论】:

    标签: string bash awk


    【解决方案1】:

    你可以使用:

    var=$(awk -v pat="AAGCTT" 'BEGIN { printf "%*s", length(pat), "" }')
    echo "${#var}"
    
    6
    

    除了printf,你可以直接使用gsub 并重复使用rep

    var=$(awk -v pat="AAGCTT" -v rep="." 'BEGIN {
    gsub(/./, rep, pat); print pat}')
    

    【讨论】:

    • 我想在 awk 的以下操作中重用 reppat 变量,所以这对我来说可能不是一个好的解决方案
    • 我们可以使用rep,但您的"printf '.%.0s' length(pat)" 语法是错误的,因为它试图在shell 中执行printf 并使用错误的shell 语法。
    • 查看我关于如何使用rep 参数的更新答案。
    • 虽然这是正确的,但如果需要,我必须将pat 更改两次,这样会更复杂,无论如何,谢谢
    • @hey0god 你在说什么?如果这不符合您的要求,那么您为什么接受它作为答案,从而阻止其他人发布可能符合您要求的答案?
    【解决方案2】:

    我找到了一种方法来分配 replength(pat) 的重复字符 X

    awk -v pat="AAGCTT" -v rep="X" 'BEGIN {var = pat;gsub(/./,rep,var);} {
        some action
    }'
    

    在哪里

    pat = "AAGCTT"
    rep = "X"
    var = "XXXXXX"
    

    【讨论】:

    • 这怎么比@anubhava 在他的回答中向您展示的更优雅?您的脚本只是对他提供的第二个脚本的一个小调整,因此您现在正在对替换字符进行硬编码。
    • 我刚刚编辑了自己的答案,删除了硬代码,功能与@anubhava 答案相同,但pat 变量只需要更改一次
    • 我认为你一定误解了@anubhavas 脚本在做什么,因为他在第一个脚本中完全更改了pat 变量,而在第二个脚本中只更改了一次。您的唯一区别是您引入了一个不必要的 awk 变量,名为 var
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2013-11-04
    • 2019-08-16
    相关资源
    最近更新 更多