如果文件与 csv 列中的名称匹配,我该如何重命名文件?

How do I rename files if they match with names within a csv column?

我在一个目录中工作,其中有很多(大约 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(与 csv 文件中名为 File.name 的第 2 列中的名称匹配)。

我不太熟悉编码,所以我会尝试解释我想做什么。 我希望脚本重命名文件夹中的 bam 文件,名称为 Donor+Type(第 3 列和第 4 列)。 因此,如果 Donor.1234-xyz.bam 也在 csv 文件的 File.name 列中找到,那么我希望使用第 3 列和第 4 列中的字符串调用它(基本上我想替换bam 名称中的所有内容 Donor 和 Type 的对应栏)。

    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

但它确实不起作用,正如我所说,我仍然很天真。 那么,你能帮我解决这个问题吗?

假设您的文件是这样的:

$ 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
#!/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

假设目录包含

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);
  • 将它们拆分为 comma-separated 个字段 (IFS=, read -r id filename donor type)
  • 正在检查 csv 文件中列出的文件名是否存在 ([[ -f "$filename" ]])
  • 然后发出 mv 命令。

如果您对该输出感到满意,请删除 echo 以实际重命名文件。

awk -F, '{print "[ -f \"""\" ] && mv \"""\" \"""_""\""}' kich.csv | sh