목록.txt
GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
GETID_9248_knownids_6/10_Confidence_0.439_Length_2474
GETID_11084_knownids_3/3_Confidence_0.600_Length_1451
GETID_15916_knownids_10/11_Confidence_0.324_Length_1825
샘플 1.txt
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample1
sampletextforsample1
sampletextforsample1
>GETID_18457_knownids_1/2_Confidence_0.625_Length_2532
sample2textforsample1
sample2textforsample1
sample2textforsample1
sample2textforsample1
샘플 2.txt
>GETID_11084_knownids_3/3_Confidence_0.600_Length_1451
sampletextforsample2
sampletextforsample2
>GETID_67838_knownids_3/3_Confidence_0.600_Length_1451
sample2textforsample2
sample2textforsample2
샘플 3.txt
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample3
sampletextforsample3
sampletextforsample3
>GETID_15916_knownids_10/11_Confidence_0.324_Length_1825
sample2textforsample3
sample2textforsample3
출력.txt
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample1
sampletextforsample1
sampletextforsample1
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample3
sampletextforsample3
sampletextforsample3
>GETID_11084_knownids_3/3_Confidence_0.600_Length_1451
sampletextforsample2
sampletextforsample2
>GETID_15916_knownids_10/11_Confidence_0.324_Length_1825
sample2textforsample3
sample2textforsample3
list.txt의 각 행을 읽고 싶습니다(대괄호 안의 값을 캡처하여(GETID_{17049}모두 다 아는{1/2}_Confidence_1.0_Length_{2532}) 여러 줄로 구성된 example1.txt, Sample2.txt, Sample3.txt와 비교하여 list.txt(output.txt)와 일치하면 이 파일의 내용을 인쇄합니다. 출력에는 list.txt와 정확히 일치하는 항목이 포함되어야 합니다. awk/sed/perl에 대한 도움을 주시면 감사하겠습니다.
답변1
제공된 솔루션을 약간 수정하면자일스존재하다이것질문(라고도 함)jw013output.txt
), 순서가 입력 시퀀스를 기반으로 하고 질문에 나열된 순서와 다르다는 점 을 제외하고 요청한 효과를 얻을 수 있습니다.
awk -v patterns_file=list.txt '
BEGIN {
while (getline < patterns_file)
patterns_array[">" $0] = 1
close(patterns_file)
}
$0 in patterns_array { print; getline; print }
' sample[1-3].txt
산출:
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample1
>GETID_11084_knownids_3/3_Confidence_0.600_Length_1451
sampletextforsample2
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample3
>GETID_15916_knownids_10/11_Confidence_0.324_Length_1825
sample2textforsample3
편집하다
여러 줄의 레코드가 작동하도록 하려면 적절한 레코드 구분 기호( RS
)를 사용하십시오. 귀하의 경우에는 greater-than
파일 시작 부분( ^>
) 또는 new-line
뒤 greater-than
( \n>
) 또는 new-line
파일 끝 부분( \n$
)으로 설정하는 것이 좋은 옵션인 것 같습니다. 제공된 입력에 대해.
다음과 같이 작동해야 합니다.
awk -v patterns_file=patterns.txt '
BEGIN {
while (getline < patterns_file)
patterns_array[$0] = 1
close(patterns_file)
RS="^>|\n>|\n$"
}
$1 in patterns_array { print ">" $0 }
' sample[1-3].txt
편집 2
각 레코드를 한 번만 출력하려면 patterns_array
사후 출력에서 해당 레코드를 제거하십시오.
awk -v patterns_file=patterns.txt '
BEGIN {
while (getline < patterns_file)
patterns_array[$0] = 1
close(patterns_file)
RS="^>|\n>|\n$"
}
$1 in patterns_array { print ">" $0; delete patterns_array[$1] }
' sample[1-3].txt
답변2
이것은 PERL 솔루션입니다. 여러 파일에 대해 작동하며 첫 번째 파일이 목록일 것으로 예상합니다. 또한 FASTA 헤더에 파일 이름을 추가합니다.
#!/usr/bin/perl -w
use strict;
my $list=shift;
open(A,$list);
my %k;
while(<A>){
## Remove trailing newline
chomp;
if ( /(\d+?)_knownids_(.+?)_.+?(\d+)$/){
## Concatenate the patterns and save in a hash
my $pp=join("-", $1,$2,$3);
$k{PAT}{$pp}=$_;
}
}
close(A);
## Read each input file
my $name;
for my $f (@ARGV) {
open(F,$f);
while(<F>){
## Skip empty lines
next if /^\s*$/;
## Is this a FASTA header?
if ( /^\s*>/){
## If this id is in the list, keep it for this file
if(/(\d+?)_knownids_(.+?)_.+?(\d+)$/){
$name=join("-", $1,$2,$3);
}
## Skip the sequences we are not interested in
else{$name="foo"}
}
## Collect the sequence
else {
if (defined($k{PAT}{$name})) {
$k{$f}{$name}.=$_;
}
}
}
close(F);
}
## For each unique pattern found in list.txt
foreach my $pat (keys(%{$k{PAT}})) {
## For each of the files passed as arguments
foreach my $file (@ARGV) {
## If the pattern was found in that file, print
if (defined($k{$file}{$pat})) {
print ">$k{PAT}{$pat}_$file\n";
print "$k{$file}{$pat}"
}
}
}
스크립트가 다음과 같이 저장된 경우 compare.pl
:
$ ./compare.pl list.txt sample1.txt sample2.txt sample3.txt sampleN.txt
출력은 다음과 같습니다
> GETID_11084_knownids_3/3_Confidence_0.600_Length_1451_sample2.txt
sampletextforsample2
> GETID_17049_knownids_1/2_Confidence_0.625_Length_2532_sample1.txt
sampletextforsample1
> GETID_17049_knownids_1/2_Confidence_0.625_Length_2532_sample3.txt
sampletextforsample3
> GETID_15916_knownids_10/11_Confidence_0.324_Length_1825_sample3.txt
sample2textforsample3