다른 파일의 일치 패턴을 기반으로 파일 이름 바꾸기

다른 파일의 일치 패턴을 기반으로 파일 이름 바꾸기

파일 목록이 있습니다.

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와 같이 두 개의 밑줄 사이)는 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 파일의 두 번째 열)로 바꾸고 처음부터 "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(테스트 실행)합니다.

관련 정보