我正在一個目錄中作業,其中有很多(大約 100 個)具有特定名稱的 BAM 檔案。在同一目錄中,我還有一個包含 4 列的 csv 檔案:FileID, File.name, Donor, Type
假設我在目錄中的 bam 檔案是:(Donor.1234-xyz.bam, Donor.5678-abc.bam, Donor.1011-def.bam, Donor.1213-ghi.bam與第 2 列中的名稱匹配,稱為 csv 檔案的 File.name)。
我對編碼不是很熟悉,所以我會嘗試解釋我想做的事情。我希望腳本重命名檔案夾中名為 Donor Type 的 bam 檔案(第 3 列和第 4 列)。因此,如果在 csv 檔案的 File.name 列中也找到了 Donor.1234-xyz.bam,那么我希望用第 3 列和第 4 列中的字串呼叫它(基本上我想用所有內容替換 bam 名稱在捐助者和型別的相應列中)。
BAM_FILE="*.bam"
BAM=$BAM_FILE
NAME="cat kich.csv | cut -f2 -s"
NM=$NAME
DONOR="cat kich.csv | cut -f3 -s"
DO=$DONOR
TYPE="cat kich.csv | cut -f4 -s"
TY=$TYPE
for file_name in "$BAM";
do
if [[ "$file_name" == "$NM" ]] then
mv ${file_name} ${DO}_${TY} ;
done
但它并沒有真正起作用,正如我所說的,我仍然很天真。那么,你能幫我解決這個問題嗎?
uj5u.com熱心網友回復:
#!/bin/bash
while IFS=, read -r id name donor type; do
in="${name}.bam"
! [ -f "$in" ] && continue
out="${donor}_${type}.bam"
if [ -f "$out" ]; then
echo "output exists: $out"
continue
fi
echo mv -iv "$in" "$out"
done <kich.csv
uj5u.com熱心網友回復:
假設目錄包含
Donor.1011-def.bam
Donor.1234-xyz.bam
Donor.5678-abc.bam
kich.csv
和 kich.csv 包含
1,Donor.1234-xyz.bam,DO1,TY1
2,Donor.5678-abc.bam,DO2,TY2
3,Donor.1011-def.bam,DO3,TY3
4,Donor.1213-ghi.bam,DO4,TY4
(請注意,csv 檔案包含的內容多于目錄中的內容)
我不會遍歷檔案,而是遍歷 csv 檔案的內容:
while IFS=, read -r id filename donor type; do
if [[ -f "$filename" ]]; then
echo mv "$filename" "${donor}_${type}"
fi
done < kich.csv
哪個輸出
mv Donor.1234-xyz.bam DO1_TY1
mv Donor.5678-abc.bam DO2_TY2
mv Donor.1011-def.bam DO3_TY3
該回圈是:
- 從 csv 檔案中讀取行 (
< kich.csv); - 將它們分成逗號分隔的欄位 (
IFS=, read -r id filename donor type) - 檢查 csv 檔案中列出的檔案名是否存在 (
[[ -f "$filename" ]]) - 然后發出 mv 命令。
如果您對該輸出感到滿意,請洗掉echo以實際重命名檔案。
uj5u.com熱心網友回復:
假設您的檔案是這樣的:
$ cat file.csv
01;file01;part1;part2
02;file02;part3;part4
你可以試試看
while read -r line;
do
file=$(echo $line | cut -d";" -f2)
newName=$(echo $line | cut -d";" -f3)_$(echo $line | cut -d";" -f4)
mv $file $newName
done < file.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471505.html
上一篇:錯誤型別引數分配的錯誤
