使用文本文件中的前缀重命名文件

Pau*_*aul 1 regex awk sed

我有一组名为的文件

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 A01A02A03A04然后添加相应的数字作为前缀的文件名.此外,还为所有文件名添加前缀,FS如上所示.

我手动尝试这样做,但一次只能用于一个文件

rename 's/^/FS_170_/' *A01 
Run Code Online (Sandbox Code Playgroud)

要得到

FS_170_sample_exp_A1_A01
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 6

假设您的后缀位于命名的文件中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)