我有一个包含两列的文本文件,一列代表当前文件名,另一列代表我想要作为文件最终名称的名称。文本文件是这样的:
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