Shell sed:重命名文件中的选择性字符串

Shell sed:重命名文件中的选择性字符串,shell,awk,sed,Shell,Awk,Sed,我有一个名为protein.faa的文件,其内容是: >WP_004066472.1 MULTISPECIES: NADH-quinone oxidoreductase subunit K [Thermococcus] MIPLQFVTAFLMIFMGIYAFLYKRNLIKLILALNLI LVLTSIVIGVCVLSLAMALTINAYRHYGTLDVNKLRRLRG >WP_004066568.1 MULTISPECIES: DNA-directed RNA polymeras

我有一个名为
protein.faa
的文件,其内容是:

>WP_004066472.1 MULTISPECIES: NADH-quinone oxidoreductase subunit K [Thermococcus]
MIPLQFVTAFLMIFMGIYAFLYKRNLIKLILALNLI
LVLTSIVIGVCVLSLAMALTINAYRHYGTLDVNKLRRLRG
>WP_004066568.1 MULTISPECIES: DNA-directed RNA polymerase subunit P [Thermococcus]
MVEALYKCAKCGKEF
>WP_004066764.1 MULTISPECIES: Lrp/AsnC ligand binding domain-containing protein [Thermococcus]
MVTAFILMVTAAGKEREVMEKLLTYPEVKEAYVVYG
>WP_004067064.1 MULTISPECIES: hypothetical protein [Thermococcus]
MEITIEKFKPKVTRPFKRKNEYWVKL
PSAKELVDEYFSE
我只想将每个
后面的名称重命名为文件名+订单号,即:

>protein_1 MULTISPECIES: NADH-quinone oxidoreductase subunit K [Thermococcus]
MIPLQFVTAFLMIFMGIYAFLYKRNLIKLILALNLI
LVLTSIVIGVCVLSLAMALTINAYRHYGTLDVNKLRRLRG
>protein_2 MULTISPECIES: DNA-directed RNA polymerase subunit P [Thermococcus]
MVEALYKCAKCGKEF
>protein_3 MULTISPECIES: Lrp/AsnC ligand binding domain-containing protein [Thermococcus]
MVTAFILMVTAAGKEREVMEKLLTYPEVKEAYVVYG
>protein_4 MULTISPECIES: hypothetical protein [Thermococcus]
MEITIEKFKPKVTRPFKRKNEYWVKL
PSAKELVDEYFSE
我的代码是

name="$(echo protein.faa | sed 's/....$//')"
sed "s/>.*/>${name}/" protein.faa 
这让我只能

>protein
MIPLQFVTAFLMIFMGIYAFLYKRNLIKLILALNLI
LVLTSIVIGVCVLSLAMALTINAYRHYGTLDVNKLRRLRG
>protein
MVEALYKCAKCGKEF
>protein
MVTAFILMVTAAGKEREVMEKLLTYPEVKEAYVVYG
>protein
MEITIEKFKPKVTRPFKRKNEYWVKL
PSAKELVDEYFSE

如何添加订单号并保留蛋白质I之后的内容?

此工作套件
gnu awk
更多:

awk-i替换'beginfle{fn=FILENAME;sub(/\..*$/,“”,fn);i=0}$1~/^>/{$1=“>”fn”++i}1'*.faa
>蛋白质_1多种:NADH醌氧化还原酶亚单位K[热球菌]
miplqfvtalfmifmgiyaflykrnliklilanli
LVLTSIVIGVCVLSLAMALTINAYGTLDVRLRG
>蛋白质2多物种:DNA定向RNA聚合酶亚单位P[热球菌]
MVEALYKCAKCGKEF
>蛋白质_3多物种:含Lrp/AsnC配体结合域的蛋白质[热球菌]
MVTAFilmVTAAGKEREVMEKLL类型VKEAYVYG
>蛋白质4多种:假设蛋白质[热球菌]
MEITIEKFKPKVTRPFKRKNEYWVKL
诗篇
要使gnu awk更具可读性,请执行以下操作:

awk-i in place'beginfle{
fn=文件名
子(/\..*$/,“”,fn)
i=0
}
$1 ~ /^>/{
$1=“>”fn“”++i
}1'*.联邦航空局
对于
非gnu
awk:

用于*.faa中的f;做
awk'beginfle{fn=FILENAME;sub(/\..*$/,“”,fn)}$1~/^>/{$1=“>”fn“++i}1'”$f“>\u tmp&&mv\u tmp“$f”
完成

使用以下Perl单行程序:

perl -pe 'BEGIN { $i = 1; chomp( $basename = `basename $ARGV[0] .faa` ); } s{^>\S+}{>${basename}_${i}} and $i++; ' in.faa > out.faa
要就地更改文件,请执行以下操作:

perl -i.bak -pe 'BEGIN { $i = 1; chomp( $basename = `basename $ARGV[0] .faa` ); } s{^>\S+}{>${basename}_${i}} and $i++; ' in.faa
Perl one liner使用以下命令行标志:
-e
:告诉Perl在线查找代码,而不是在文件中。
-p
:一次循环输入一行,默认情况下将其分配给
$\uu
。在每次循环迭代后添加
print$\uuz

-i.bak
:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在原始文件的名称后附加扩展名
.bak
,保存原始文件的备份副本

另请参见:



但这种方式仅适用于文件名为protein.faa的情况,但如果它是自定义名称(加上我在dir中对所有*.faa文件进行循环),该怎么办?检查我的更新答案,以便对多个
*.faa
文件执行此操作。它在没有
-i inplace
的情况下运行良好,并返回一个错误。我使其在所有
文件上循环运行。faa
文件每次保存到tmp文件:
awk$f>tmp和&mvtmp$f
是的,正如我提到的
-I inplace
是gnu扩展,所以如果您没有使用
gnu awk
,那么该选项将不起作用。正如您所建议的,循环可以正常工作。我将进一步更新非gnu awk的答案。只有一条注释:它将
之后的标识符替换为
蛋白质X
,而我需要将
文件名X
@plnnvkv更新了答案。