首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果文件与csv列中的名称匹配,如何重命名它们?

如果文件与csv列中的名称匹配,如何重命名它们?
EN

Stack Overflow用户
提问于 2022-05-09 16:35:17
回答 4查看 411关注 0票数 0

我在一个目录中工作,其中有很多(大约100个)具有特定名称的BAM文件。在同一个目录中,我还有一个csv文件,其中包含4列: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列中的名称相匹配)。

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

代码语言:javascript
复制
    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

但这并不是真的,就像我说的,我还是天真的。所以,你能帮我解决这个问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-05-09 16:57:58

假设您的文件是这样的:

代码语言:javascript
复制
$ cat file.csv     
01;file01;part1;part2
02;file02;part3;part4

你可以试试

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2022-05-09 16:58:17

代码语言:javascript
复制
#!/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
票数 1
EN

Stack Overflow用户

发布于 2022-05-09 18:19:34

让我们假设目录包含

代码语言:javascript
复制
Donor.1011-def.bam
Donor.1234-xyz.bam
Donor.5678-abc.bam
kich.csv

而kich.csv包含

代码语言:javascript
复制
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文件的内容:

代码语言:javascript
复制
while IFS=, read -r id filename donor type; do
    if [[ -f "$filename" ]]; then
        echo mv "$filename" "${donor}_${type}"
    fi
done < kich.csv

哪种输出

代码语言:javascript
复制
mv Donor.1234-xyz.bam DO1_TY1
mv Donor.5678-abc.bam DO2_TY2
mv Donor.1011-def.bam DO3_TY3

这个循环是:

从csv文件(< kich.csv);

  • splitting读取行到逗号分隔的字段(IFS=, read -r id filename donor type)

  • checking,以查看csv文件中列出的文件名是否存在([[ -f "$filename" ]])

  • then,([[ -f "$filename" ]])

  • then发出mv命令.

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72175379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档