Awk

讀取包含兩列的文件並使用它們更改文件名

  • August 13, 2022

我有一個包含兩列的文本文件,一列代表目前文件名,另一列代表我想要作為文件最終名稱的名稱。文本文件是這樣的:

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命令。

引用自:https://unix.stackexchange.com/questions/713482