我有一组名为的文件
sample_exp_A1_A01
sample_exp_A2_A02
sample_exp_A3_A03
sample_exp_A4_A04
sample_exp_A5_A05
Run Code Online (Sandbox Code Playgroud)
我有一个包含以下值的文本文件
A01 170
A02 186
A03 165
A04 130
A05 120
Run Code Online (Sandbox Code Playgroud)
我想根据文本文件值重命名文件
FS_170_sample_exp_A1_A01
FS_186_sample_exp_A2_A02
FS_165_sample_exp_A3_A03
FS_130_sample_exp_A4_A04
FS_120_sample_exp_A5_A05
Run Code Online (Sandbox Code Playgroud)
所以在文本文件基础上匹配的ID A01或A02或A03或A04然后添加相应的数字作为前缀的文件名.此外,还为所有文件名添加前缀,FS如上所示.
我手动尝试这样做,但一次只能用于一个文件
rename 's/^/FS_170_/' *A01
Run Code Online (Sandbox Code Playgroud)
要得到
FS_170_sample_exp_A1_A01
Run Code Online (Sandbox Code Playgroud)
假设您的后缀位于命名的文件中suffix,您可以这样做:
for fname in sample*; do
echo mv "$fname" FS_"$(awk -v pf="${fname##*_}" \
'$1 == pf {print $2}' suffix)"_"$fname"
done
Run Code Online (Sandbox Code Playgroud)
它遍历所有文件; 在循环中,它通过前置FS_和输出将新文件名放在一起
awk -v pf="${fname##*_}" '$1 == pf {print $2}' suffix
Run Code Online (Sandbox Code Playgroud)
这会将输入文件名的最后一部分分配给awk变量pf,然后,对于suffix第一个字段与该变量匹配的行,将打印第二个字段.
或者,如果你有一个支持Perl兼容正则表达式的grep,你可以使用grep -Po "${fname##*_} \K.*" suffix(使用可变大小的look-behind \K):
for fname in sample*; do
echo mv "$fname" FS_"$(grep -Po "${fname##*_} \K.*" suffix)"_"$fname"
done
Run Code Online (Sandbox Code Playgroud)
这将添加到新文件名中,新名称的其余部分是完整的旧名称.
对于您的输入文件,这会导致
mv sample_exp_A1_A01 FS_170_sample_exp_A1_A01
mv sample_exp_A2_A02 FS_186_sample_exp_A2_A02
mv sample_exp_A3_A03 FS_165_sample_exp_A3_A03
mv sample_exp_A4_A04 FS_130_sample_exp_A4_A04
mv sample_exp_A5_A05 FS_120_sample_exp_A5_A05
Run Code Online (Sandbox Code Playgroud)
要实际重命名文件,echo必须删除.
如果suffix是巨大的,你可以通过在第一场比赛后退出awk来加速这个:
awk -v pf="${fname##*_}" '$1 == pf {print $2; exit}' suffix
Run Code Online (Sandbox Code Playgroud)
或者grep在第一场比赛后停止:
grep -m 1 -Po "${fname##*_} \K.*" suffix
Run Code Online (Sandbox Code Playgroud)