【问题标题】:Awk gsub replacement concatenationawk gsub 替换串联
【发布时间】:2021-01-29 07:22:32
【问题描述】:

我有一个包含以下内容的文件:

>NODE_1_length_281510_cov_20.148788
CGTCGAGACAACCAAGAAGCACGGCAACTCGCCCTACAACGCAATCCTCGCCCTTCTCTA

我想在 > 和 NODE 之间插入一个变量来获取

>variable_NODE_1_length_281510_cov_20.148788
CGTCGAGACAACCAAGAAGCACGGCAACTCGCCCTACAACGCAATCCTCGCCCTTCTCTA
    

是否可以在 awk 中使用 gsub 执行类似以下操作? $foo 是变量。

  awk -v a="$foo" '{if(!/>NODE/){print; next}; gsub("NODE",a,$1);print}' "$file">> "${foo}.fasta"

我没有收到任何错误。脚本只是卡住了。我知道我的解决方案只会用目录名称替换单词 NODE。是否可以在 gsub 内部进行连接?

【问题讨论】:

    标签: linux shell awk


    【解决方案1】:

    awk 使用 sub() 的示例

    bar=par_dir_name
    awk -v pdir="$bar" '{ sub("^>NODE",pdir "_NODE"); print }' infile >> "${bar}.fasta"
    

    gnu 示例awk gensub()

    bar=par_dir_name
    awk -v pdir="$bar" '{ print gensub("^>NODE",pdir "_NODE",1) }' infile >> "${bar}.fasta"
    

    更简单的替代方案:

    bar=par_dir_name
    sed "s/^>NODE/>${bar}_NODE/" infile >> "${bar}".fasta
    

    【讨论】:

    • 这在几个方面很脆弱。使用bar='this&that'bar='this\that'bar='this\1that'bar='this\\\0that' 等尝试这些脚本。
    【解决方案2】:

    不要将 *sub() 与目录名称一起用作参数,否则您必须引入对可能在目录名称中的元字符的处理。只需将目录名称视为字符串,例如从/home/Ed/tmp运行:

    $ awk 'sub(/^>/,""){$0=">" ENVIRON["PWD"] "_" $0} 1' file
    >/home/Ed/tmp_NODE_1_length_281510_cov_20.148788
    CGTCGAGACAACCAAGAAGCACGGCAACTCGCCCTACAACGCAATCCTCGCCCTTCTCTA
    

    或:

    $ awk -v dir="$PWD" 'sub(/^>/,""){$0=">" dir "_" $0} 1' file
    >/home/Ed/tmp_NODE_1_length_281510_cov_20.148788
    CGTCGAGACAACCAAGAAGCACGGCAACTCGCCCTACAACGCAATCCTCGCCCTTCTCTA
    

    或者如果您的目录名称可以包含反斜杠并且您想使用用户定义的变量,那么:

    $ dir="$PWD" awk 'sub(/^>/,""){$0=">" ENVIRON["dir"] "_" $0} 1' file
    >/home/Ed/tmp_NODE_1_length_281510_cov_20.148788
    CGTCGAGACAACCAAGAAGCACGGCAACTCGCCCTACAACGCAATCCTCGCCCTTCTCTA
    

    【讨论】:

    • @RavinderSingh13 它是 POSIX 的一部分,因此对于至少符合 POSIX 的所有 awk 来说都是通用的。见pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html
    • 这很好,不幸的是我的文件路径很长,第一行只能有 50 个字符。
    • @skiventist 行的长度与我的解决方案与任何其他解决方案有什么关系?您希望如何处理较长的行 - 从前面截断,从后面截断或其他?请edit您的问题包括这些详细信息/要求。
    • @EdMorton 更新了!我的错。先生,将来可能需要您的帮助。
    • 我仍然不明白我展示的内容如何不能解决您的问题(并且比您当前接受的答案更强大)但是好的,不用担心。
    猜你喜欢
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多