【问题标题】:gsub in awk with variableawk中的gsub与变量
【发布时间】:2019-07-24 01:59:11
【问题描述】:

我想用以“.”开头并以“.”结尾的变量名替换“>”。但是下面的代码没有打印变量名。

for f in *.fasta; 
do  
nam=$(basename $f .fasta);
awk '{print $f}' $f | awk '{gsub(">", ">$nam."); print $0}'; done

输入第一个文件sample01.fasta:

sample01.fasta:

 >textofDNA
 ATCCCCGGG
 >textofDNA2
 ATCCCCGGGTTTT

预期输出:

 >sample01.textofDNA
 ATCCCCGGG
 >sample01.textofDNA2
 ATCCCCGGGTTTT

【问题讨论】:

    标签: linux awk gsub


    【解决方案1】:
    $ awk 'FNR==1{fname=FILENAME; sub(/[^.]+$/,"",fname)} sub(/^>/,""){$0=">" fname $0} 1' *.fasta
    >sample01.textofDNA
    ATCCCCGGG
    >sample01.textofDNA2
    ATCCCCGGGTTTT
    

    与您目前得到的其他答案相比,以上内容适用于任何 awk,每个输入文件只计算一次文件名,而不是每行一次或每 >-line 一次,不会如果文件名包含其他.s,则失败,如果文件名包含&,则不会失败,如果文件名不包含字符串fasta,则不会失败@..

    【讨论】:

    • 加一为一次性文件名评估:)
    【解决方案2】:

    还是这样?您实际上并不需要循环和 basename 或两个 awk 调用。

    awk '{stub=gensub( /^([^.]+\.)fasta.*/ , "\\1", "1",FILENAME ) ; gsub( />/, ">"stub); print}' *.fasta 
     >sample01.textofDNA
     ATCCCCGGG
     >sample01.textofDNA2
     ATCCCCGGGTTTT
    

    解释:awk 通过内置变量FILENAME 知道它当前操作的文件名;我使用 gensub 剥离 .fasta 扩展,并将其存储在变量存根中。我调用 gsub 将 ">" 替换为 ">" 和我的变量 stub 的内容。之后我打印出来。

    正如 Ed 在 cmets 中指出的那样:gensub 是 GNU 扩展,不适用于其他 awk 实现。

    【讨论】:

    • 完美运行。谢谢!如果你能解释一下代码可能会更好。
    【解决方案3】:

    您也可以尝试一下吗?

    awk '/^>/{split(FILENAME,array,".");print substr($0,1,1) array[1]"." substr($0,2);next} 1'  Input_file
    

    说明:在此处添加对上述代码的说明。

    awk '
    /^>/{                                            ##Checking condition if a line starts from > then do following.
      split(FILENAME,array,".")                      ##Using split function of awk to split Input_file name here which is stored in awk variable FILENAME.
      print substr($0,1,1) array[1]"." substr($0,2)  ##Printing substring to print 1st char then array 1st element and then substring from 2nd char to till last of line.
      next                                           ##next will skip all further statements from here.
    }
    1                                                ##1 will print all lines(except line that are starting from >).
    ' sample01.fasta                                 ##Mentioning Input_file name here.
    

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 2015-02-17
      • 2019-12-21
      • 2020-01-13
      • 2013-02-03
      • 2016-06-28
      • 2019-04-21
      • 2018-03-14
      相关资源
      最近更新 更多