@로 시작하는 4줄 블록으로 구성된 두 개의 파일이 있습니다. 일치하여 주문됩니다. 파일이 너무 커서(>10GB) 각 파일의 처음 3개 블록(12줄)을 여기에 넣었습니다.
첫 번째: R 파일(참조 파일):
@NB551168:120:HTKN2BGX5:1:11101:3598:1051 2:N:0:NATC
CAATCTCTAAAGTTT
+
AA/A/EEEE///EEE
@NB551168:120:HTKN2BGX5:1:11101:24202:1051 2:N:0:NTCG
TGAGACCGGGTGTTG
+
AAAAAAEEE///<AA
@NB551168:120:HTKN2BGX5:1:11101:4381:1051 2:N:0:NCTT
GCTACTCCTAAGGCA
+
A////6/////EE//
두 번째: I 파일(인덱스 파일):
@NB551168:120:HTKN2BGX5:1:11101:3598:1051 1:N:0:NATC
NATC
+
#EEE
@NB551168:120:HTKN2BGX5:1:11101:24202:1051 1:N:0:NTCG
NTCG
+
#EEE
@NB551168:120:HTKN2BGX5:1:11101:4381:1051 1:N:0:NCTT
NCTT
+
#EEA
출력 파일에는 다음이 포함되어야 합니다(블록당(4줄)):
- 첫 번째 줄은 R2와 완전히 동일합니다(공백이 있으므로 이를 유지하는 것이 중요합니다).
- I 파일의 두 번째 줄의 4자(항상 4자)를 R 파일의 두 번째 줄의 시작 부분에 연결합니다.
- R 파일에서 3행을 3행으로 유지합니다.
- I 파일의 라인 4(모든 문자)를 R 파일의 라인 4 시작 부분에 연결합니다.
- 모든 블록에 대해 이 작업을 수행합니다.
출력 예:
@NB551168:120:HTKN2BGX5:1:11101:3598:1051 2:N:0:NATC
NATCCAATCTCTAAAGTTT
+
#EEEAA/A/EEEE///EEE
@NB551168:120:HTKN2BGX5:1:11101:24202:1051 2:N:0:NTCG
NTCGTGAGACCGGGTGTTG
+
#EEEAAAAAAEEE///<AA
@NB551168:120:HTKN2BGX5:1:11101:4381:1051 2:N:0:NCTT
NCTTGCTACTCCTAAGGCA
+
#EEAA////6/////EE//
정말 고마워요, 응
답변1
#!/usr/bin/perl
use strict;
my $f1 = shift;
my $f2 = shift;
open(F1,"<",$f1) || die "couldn't open '$f1' for read: $!\n";
open(F2,"<",$f2) || die "couldn't open '$f2' for read: $!\n";
# set the input record separator (IRS) to '@'
$/='@';
# Normally the IRS is found at the END of a record, but your input
# files START with the input record separator, so we need to throw
# away the first (bogus) input record (i.e. everything from the start
# of the files to the first @ characters in them. in other words, the
# first @ characters in both files.)
my $junk = <F1>;
$junk = <F2>;
while (!eof(F1) && !eof(F2)) {
my @record1 = split(/\n/, <F1>);
my @record2 = split(/\n/, <F2>);
printf "%s%s\n", $/, $record1[0]; # prepend the IRS
printf "%s%s\n", substr($record2[1],0,4), $record1[1];
printf "%s\n", $record2[2];
printf "%s%s\n", $record2[3], $record1[3];
};
close(F1);
close(F2);
이는 읽기 위해 두 파일을 모두 열고 $/
Perl의 입력 레코드 구분 변수를 한 @
문자로 설정합니다.
그런 다음 두 파일 모두 EOF에 도달하지 않으면 각 파일에서 하나의 레코드를 읽고 레코드를 배열로 분할한 다음(줄 바꿈을 \n
구분 기호로 사용) 지정된 대로 병합된 레코드를 출력합니다.
Perl 배열은 1이 아닌 0에서 시작합니다. 예를 들어 $record1[0]
file1에 기록된 첫 번째 줄은 다음과 같습니다.
스크립트를 파일(예 hassan.pl
: )에 저장하고 실행 가능하게 만든 후 chmod +x hassan.pl
다음과 같이 실행합니다.
예제 출력:
$ ./hassan.pl file1.txt file2.txt
@NB551168:120:HTKN2BGX5:1:11101:3598:1051 2:N:0:NATC
NATCCAATCTCTAAAGTTT
+
#EEEAA/A/EEEE///EEE
@NB551168:120:HTKN2BGX5:1:11101:24202:1051 2:N:0:NTCG
NTCGTGAGACCGGGTGTTG
+
#EEEAAAAAAEEE///<AA
@NB551168:120:HTKN2BGX5:1:11101:4381:1051 2:N:0:NCTT
NCTTGCTACTCCTAAGGCA
+
#EEAA////6/////EE//
diff
( 이 출력이 원하는 것과 정확히 일치하는지 확인했습니다 .)
답변2
즉, 해당 +
줄과 로 시작하는 줄을 제외하고 이 줄 앞에 @
모든 줄을 붙여넣습니다 .I
R
이유를 이해하면 매우 간단해집니다.
sed '/^[@+]/s/.*//' I|paste -d '' - R
/^[@+]/
+
또는로 시작하는 줄 선택@
s/.*//
이 줄을 지워paste -d '' - R
구분 기호( )(파이프된 입력의 경우) 없이 결과를-
파일에 붙여넣습니다.-d ''
R
답변3
Gnu sed에 액세스할 수 있는 경우 다음을 수행할 수 있습니다.
$ sed -e 'R I' R | sed -ne 'p;n;n;h;n;G;s/\n//p'