带有变量的awk中的gsub

gsub in awk with variable

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

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

第一个文件的输入sample01.fasta:

sample01.fasta:

 >textofDNA
 ATCCCCGGG
 >textofDNA2
 ATCCCCGGGTTTT

预期输出:

 >sample01.textofDNA
 ATCCCCGGG
 >sample01.textofDNA2
 ATCCCCGGGTTTT

或者像这样?您真的不需要循环和基本名称或两个 awk 调用。

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

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

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

能不能请你也试试看

awk '/^>/{split(FILENAME,array,".");print substr([=10=],1,1) array[1]"." substr([=10=],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([=11=],1,1) array[1]"." substr([=11=],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.
$ awk 'FNR==1{fname=FILENAME; sub(/[^.]+$/,"",fname)} sub(/^>/,""){[=10=]=">" fname [=10=]} 1' *.fasta
>sample01.textofDNA
ATCCCCGGG
>sample01.textofDNA2
ATCCCCGGGTTTT

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