带有变量的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=]..
我想用以“>”开头并以“.”结尾的变量名替换“>”。但是下面的代码没有打印变量名。
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=]..