我在一个目录中工作,其中有很多(大约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名称替换为供体和类型的对应列中的所有内容)。
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但这并不是真的,就像我说的,我还是天真的。所以,你能帮我解决这个问题吗?
发布于 2022-05-09 16:57:58
假设您的文件是这样的:
$ 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发布于 2022-05-09 16:58:17
#!/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发布于 2022-05-09 18:19:34
让我们假设目录包含
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)
[[ -f "$filename" ]])
[[ -f "$filename" ]])
。
如果您对该输出感到满意,请删除echo以实际重命名文件。
https://stackoverflow.com/questions/72175379
复制相似问题