텍스트 줄의 일부를 다음 줄로 이동하는 방법은 무엇입니까?

텍스트 줄의 일부를 다음 줄로 이동하는 방법은 무엇입니까?

첫 번째 줄의 일부와 다음 줄에 추가 텍스트 문자열을 추가하려는 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

관련 정보