첫 번째 줄의 일부와 다음 줄에 추가 텍스트 문자열을 추가하려는 RNA 시퀀싱의 fastq 파일이 있습니다.
내 파일의 처음 8줄은 다음과 같습니다.
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCT
+
FFDFFFFFFFFGFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGA
+
F:FFFGF?FGGFFFFGFFEE
@로 시작하는 각 줄에서 #과 /1 사이의 부분을 다음 줄 끝까지 복사한 다음 문자열을 복사하고 싶습니다.AGTCGGAGGC. 결과는 다음과 같습니다.
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCTTCCTCGCATGAGTCGGAGGC
+
FFDFFFFFFFFGFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGACTGATATAGAAGTCGGAGGC
+
F:FFFGF?FGGFFFFGFFEE
나는 확인했다텍스트를 찾고 복사하여 파일의 다음 줄에 삽입하려면 어떻게 해야 합니까?, 그러나 이 예에서는 기존 행에 추가되는 대신 새 행이 삽입됩니다. 또한 다음을 시도했지만 검색된 문자열을 (이미 존재하는) 끝에 추가/복사하는 방법을 알 수 없습니다.다음철사.
sed -E 's%#(.*)/%$\1AGTCGGAGGC%g' test3.txt > test3new.txt
답변1
$ cat tst.awk
str != "" { $0 = $0 str "AGTCGGAGGC"; str="" }
match($0,"#.*/") { str = substr($0,RSTART+1,RLENGTH-2) }
{ print }
$ awk -f tst.awk file
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCTTCCTCGCATGAGTCGGAGGC
+
FFDFFFFFFFFGFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGACTGATATAGAAGTCGGAGGC
+
F:FFFGF?FGGFFFFGFFEE
답변2
사용 sed
:
sed -E '/^@/{ N; s/^(.*)#(.*)\/1(.*)/\1#\2\/1\3\2AGTCGGAGGC/; }' infile
한 줄로 시작하는 경우 추가 줄을 @
읽고 N
나중에 이를 반환하고 주문 요구 사항에 따라 추가하는 데 사용할 3개 그룹을 캡처합니다 2AGTCGGAGGC
.
답변3
awk와 의 조합을 사용하는 것이 좋습니다.시퀀스 키트. 다음 명령은 데이터를 조작하기 쉬운 탭으로 구분된 파일로 변환한 후 fastq로 복원합니다.
seqkit fx2tab text.fq | awk '{ tag=$1; gsub(/(^.*#)|(\/1$)/,"" , tag); print $1 "\t" $2 tag "\t" $3 "FFFFFFFFFF"}' | seqkit tab2fx
그런 다음 올바른 fastq 형식을 유지하기 위해 phred+33을 사용한 품질 점수 확장을 포함하여 원하는 출력을 얻을 수 있습니다.
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCTTCCTCGCATG
+
FFDFFFFFFFFGFFFFFFFFFFFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGACTGATATAGA
+
F:FFFGF?FGGFFFFGFFEEFFFFFFFFFF
라벨의 크기가 가변적이라면 발견된 코드에 따라 다음 변형을 사용할 수 있습니다.여기:
seqkit fx2tab text.fq | awk ' function str_repeat(s1, n1) {s2 = ""; for (n2 = 1; n2 <= n1; n2++) {s2 = s2 s1} return s2 }; {tag=$1; gsub(/(^.*#)|(\/1$)/,"" , tag); print $1 "\t" $2 tag "\t" $3 str_repeat("F", length(tag)) }'
답변4
GNU sed
확장 정규식 패턴을 사용하여 -E
마지막 줄이 아닌 한 다음 줄을 @ 줄에 붙여넣습니다. 그런 다음 #과 /1 사이의 텍스트를 잡고 정규식에 \n을 넣어 해당 텍스트가 @ 줄에서 나오는지 확인한 다음 패턴 공간 끝에 붙여넣습니다.
sed -Ee '
/@/{$!N;}
s|#(.*)/1.*\n.*|&\1AGTCGGAGGC|
' file