
ファイルのリストがあります。
out_CCGCGGTT+CTAGCGCT_R1.fq.gz
out_TTATAACC+TCGATATC_R2.fq.gz
out_GGACTTGG+CGTCTGCG_R1.fq.gz
out_AAGTCCAA+TACTCATA_R2.fq.gz
...
アダプターID(AACGTTCC + AGTACTCC、AACGTTCC + AGTACTCCなどの2つの下線の間)は、ID.file.txtの最初の列と一致します。
head ID.file.txt:
CCGCGGTT+CTAGCGCT NHL_332_N
TTATAACC+TCGATATC NHL_333_T
GGACTTGG+CGTCTGCG NHL_334_T
AAGTCCAA+TACTCATA NHL_335_T
ATCCACTG+ACGCACCT NHL_336_N
GCTTGTCA+GTATGTTC NHL_337_N
CAAGCTAG+CGCTATGT NHL_338_N
TGGATCGA+TATCGCAC NHL_339_T
...
このファイルの名前を変更して一致する場合は、アダプタIDを実際のID(IDファイルの2番目の列)に変更し、最初から「out」を削除したいと思います。
最終ファイル名は、例えば次のようになります。
NHL_332_N_R1.fq.gz
NHL_333_T_R2.fq.gz
NHL_334_T_R1.fq.gz
NHL_335_T_R2.fq.gz
Bashでこれを行う方法はありますか?
答え1
Perlスクリプトの使用:
#!/usr/bin/perl
use strict; use warnings;
my %h;
open(my $id_file, '<', 'ID.file.txt') or die "$!";
while (<$id_file>) {
chomp;
my ($pid, $id) = split /\s+/, $_, 2;
$h{$pid} = $id;
}
close($id_file);
foreach my $file (glob('*.fq.gz')) {
if ($file =~ /^out_(.+)_R(\d)\.fq\.gz$/) {
my $pid = $1;
my $read_num = $2;
my $id = $h{$pid};
if ($id) {
my $new = "${id}_R${read_num}.fq.gz";
rename($file, $new) or die "$!";
}
}
}
答え2
そしてzsh
:
autoload -Uz zmv
typeset -A map=( $(<ID.file.txt) )
zmv -n '(out_)(*)(_R<->.fq.gz)' '${map[$2]-$1$2}$3'
満足すれば削除-n
(テスト実行)します。