새 문자열 "title"이 나타날 때까지 다른 줄 앞에 문자열 "title"을 어떻게 넣을 수 있습니까? awk, sed, Perl 등을 사용하여 재귀 문제를 해결했습니다.

새 문자열 "title"이 나타날 때까지 다른 줄 앞에 문자열 "title"을 어떻게 넣을 수 있습니까? awk, sed, Perl 등을 사용하여 재귀 문제를 해결했습니다.

다음 콘텐츠가 포함된 1백만 줄이 넘는 txt 파일이 있습니다(Match_n과 "cggggg" 사이의 탭).

Sequence_1
Match_1 cggggg
Match_2 gggggc
Match_3 ggggcc
Match_4 cgggcc
Match_5 agggca
Match_6 agggta
Sequence_2
Match_1 tgggca
Match_2 aggggg
Match_3 gggggc
Match_4 ggggca
Sequence_3
Match_1 cggggt
Match_2 ggggtt
Match_3 tgggga
Match_4 ggggac
Match_5 cggggc

다음 형식이 필요합니다.

Sequence_1  Match_1 cggggg
Sequence_1  Match_2 gggggc
Sequence_1  Match_3 ggggcc
Sequence_1  Match_4 cgggcc
Sequence_1  Match_5 agggca
Sequence_1  Match_6 agggta
Sequence_2  Match_1 tgggca
Sequence_2  Match_2 aggggg
Sequence_2  Match_3 gggggc
Sequence_2  Match_4 ggggca
Sequence_3  Match_1 cggggt
Sequence_3  Match_2 ggggtt
Sequence_3  Match_3 tgggga
Sequence_3  Match_4 ggggac
Sequence_3  Match_5 cggggc

추가 정보: 총 10.000개의 "Sequence_N"이 있으며, 각 시퀀스에는 서로 다른 "Match_n cggggc" 수가 있습니다.

감사해요! !

답변1

awk -v OFS='\t' 'NF==1{seq=$0; next} {print seq, $0}' file

답변2

Sequencesed를 사용하면 만나는 모든 문자열을 예약된 공간으로 옮긴 다음 꺼낼 수 있습니다 .

sed -e '/^Sequence/{h;d;}' -e 'G;s/\(.*\)\n\(.*\)/\2\t\1/' file

Sequence- 의 선두 위치를 얻으려면 일부 재배치가 필요 Match하지만 어쨌든 개행 구분 기호를 변경하는 데 필요한 교체에 이를 통합할 수 있습니다.

답변3

Perl을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

$ perl -nlE '
  /^Seq/ ? ($h=$_) : say("$h\t$_")
' file

그리고 sed를 사용하세요:

$ sed -ne ':a
    /^Seq/{h;N;}
    /\nSeq/D
    s/\n/\t/p;g;$!ba
' file

관련 정보