读取具有两列的文件并使用它们来更改文件名

读取具有两列的文件并使用它们来更改文件名

我有一个包含两列的文本文件,一列代表当前文件名,另一列代表我想要作为文件最终名称的名称。文本文件是这样的:

JALAZR010000001.1  -  CM040670.1
JALBAP010000001.1  -  CM040694.1
JALBBH010000001.1  -  CM040712.1
JALBAZ010000001.1  -  CM040704.1
JALBBR010000001.1  -  CM040722.1
JALBBU010000001.1  -  CM040725.1
JALAZL010000001.1  -  CM040664.1
JALBAE010000001.1  -  CM040680.1

该文件位于:

Genomic_data/Mito/CDS/Fungi/JALAZR010000001.1.gb

我尝试过类似的事情:

awk -F" - " '{print $1, $2}' filename.txt | mv Genomic_data/Mito/CDS/Fungi/{$1}.gb  Genomic_data/Mito/CDS/Fungi/{$2}.gb

但我不是一个经验丰富的 bash 程序员,所以我真的很感激任何有关如何将两个 awk 输出传递到 mv 程序的提示(曾经我无法做到)。预期的输出类似于:

Genomic_data/Mito/CDS/Fungi/CM040670.1.gb

谢谢你的时间。

PS - 任何其他替代示例也很棒。

答案1

您可以使用与您建议的语法接近的内容GNU并行代替 awk,例如

$ parallel --colsep ' - ' echo mv -n -- Genomic_data/Mito/CDS/Fungi/{1}.gb Genomic_data/Mito/CDS/Fungi/{2}.gb :::: filename.txt
mv -n -- Genomic_data/Mito/CDS/Fungi/JALAZR010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040670.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBAP010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040694.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBBH010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040712.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBAZ010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040704.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBBR010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040722.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBBU010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040725.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALAZL010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040664.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBAE010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040680.1.gb

echo一旦您确信它正在做正确的事情,请将其删除。

答案2

这是我的版本,其中 bash 读取您准备好的文件并构建命令mv(包括路径前缀)。该脚本假定具有旧/新文件名的输入文件名为“infile”,但可以轻松更改:

#!/usr/bin/env bash

my_input_file='infile'
rename_path="Genomic_data/Mito/CDS/Fungi"

while read -r old_fname discard new_fname
do
   mv "${rename_path}/${old_fname}.gb" "${rename_path}/${new_fname}.gb"
done < "${my_input_file}"

read操作按空格分割输入文件的行,从而形成三个字段,每个字段写入相应的变量中。它将输入文件的中间-字段存储到名为的变量discard(从未使用过)中,因为它不是文件重命名操作的一部分。

如果您想运行测试版本,只需使该mv行以 开头echo,它只会打印mv命令。

答案3

您可以mv从 awk 本身运行:

awk -F" - " '{ system("mv "$1" "$2) }' filename.txt

你也可以不使用 awk 来完成:

while read N1 SEP N2; do mv ${N1} ${N2}; done < filename.txt

相关内容