Awk
讀取包含兩列的文件並使用它們更改文件名
我有一個包含兩列的文本文件,一列代表目前文件名,另一列代表我想要作為文件最終名稱的名稱。文本文件是這樣的:
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 - 任何其他替代範例也會很棒。
您可以
mv
從 awk 本身執行:awk -F" - " '{ system("mv "$1" "$2) }' filename.txt
你也可以在沒有 awk 的情況下做到這一點:
while read N1 SEP N2; do mv ${N1} ${N2}; done < filename.txt
這是我的版本,其中 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
命令。