如果文件与 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
我在一个目录中工作,其中有很多(大约 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