我有一组名为
sample_exp_A1_A01
sample_exp_A2_A02
sample_exp_A3_A03
sample_exp_A4_A04
sample_exp_A5_A05
我有一个具有以下值的文本文件
A01 170
A02 186
A03 165
A04 130
A05 120
我想根据文本文件值重命名文件,例如
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
因此,根据A01
或A02
或A03
或匹配文本文件中的ID,A04
然后将相应的数字作为前缀添加到文件名中。此外,还应在所有文件名前添加一个前缀,FS
如上所示。
我手动尝试执行此操作,但这种方式一次只能处理一个文件
rename 's/^/FS_170_/' *A01
要得到
FS_170_sample_exp_A1_A01
假设您的后缀在名为的文件中suffix
,则可以执行以下操作:
for fname in sample*; do
echo mv "$fname" FS_"$(awk -v pf="${fname##*_}" \
'$1 == pf {print $2}' suffix)"_"$fname"
done
它遍历您的所有文件;在循环中,它通过在前面加上新的文件名FS_
并输出
awk -v pf="${fname##*_}" '$1 == pf {print $2}' suffix
这会将输入文件名的最后一部分分配给awk变量pf
,然后对于suffix
第一个字段与该变量匹配的行,输出第二个字段。
另外,如果您有一个支持Perl兼容正则表达式的grep,则可以grep -Po "${fname##*_} \K.*" suffix
改用(使用可变大小的后向标记\K
):
for fname in sample*; do
echo mv "$fname" FS_"$(grep -Po "${fname##*_} \K.*" suffix)"_"$fname"
done
这将添加到新的文件名,其余的新名称是完整的旧名称。
对于您的输入文件,这将导致
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
要实际重命名文件,echo
必须将其删除。
如果suffix
是巨大的,您可以通过在第一场比赛后退出awk来加快速度:
awk -v pf="${fname##*_}" '$1 == pf {print $2; exit}' suffix
或grep在第一场比赛后停止:
grep -m 1 -Po "${fname##*_} \K.*" suffix
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句