파일에서 특정 게놈 데이터를 수집하고 동일한 헤더에 수집

파일에서 특정 게놈 데이터를 수집하고 동일한 헤더에 수집

파일에 게놈 데이터가 있는데, genomes-seq.txt시퀀스 제목은 >.로 시작하고 그 뒤에 게놈 이름이 옵니다.

>genome.1
atcg
atcg
atcggtc

>genome.2
atct
tgcgtgctt
attttt

>genome.
sdkf
sdf;ksdf
sdlfkjdslc
edsfsfv

>genome.3
as;ldkhaskjd
asdkljdsl
asdkljasdk;l

>genome.4
ekjfhdhsa
dsfkjskajd
asdknasd


>genome.1
iruuwi
sdkljbh
sdfljnsdl

>genome.234
efijhusidh
siduhygfhuji

>genome.1
ljhdcj
sdljhsdil
fweusfhygc

다음과 같은 파일에서 게놈 1에 대한 유사한 데이터를 수집하고 싶습니다.

>genome.1
atcg
atcggtc

iruuwi
sdkljbh
sdfljnsdl
ljhdcj
sdljhsdil
fweusfhygc

하지만 sed를 사용하여 이 작업을 수행할 때마다 다음과 같은 결과를 얻습니다.

>genome.1
atcg
atcg
atcggtc

>genome.1
iruuwi
sdkljbh
sdfljnsdl

>genome.1
ljhdcj
sdljhsdil
fweusfhygc

즉, 여러 genome.1s입니다. 대규모 데이터 세트에서 모든 중복 항목을 제거할 필요가 없도록 이 작업을 올바르게 수행하려면 어떻게 해야 합니까?

답변1

$sed -nr /\>genome.1/,/^$/p file | sed '2,${/^>genome.1$/d}'

>genome.1
atcg
atcggtc

iruuwi
sdkljbh
sdfljnsdl
ljhdcj
sdljhsdil
fweusfhygc

Genome.1이 키워드이므로 생성하려는 목록에 따라 변경하세요.

답변2

펄을 사용하여

perl -00 -ne 'if (/^>genome\.1\n/) {s/// if $. > 1; print}' file

답변3

awk를 사용하세요:

{
  if (/^>/)
    in_section = 0;
  if ($0 == ">genome.1") {
    in_section = 1;
    if (!section_count++)
      print;
  } else if (in_section)
    print;
}

용법:

awk '{ if (/^>/) in_section = 0; if ($0 == ">genome.1") { in_section = 1; if (!section_count++) print; } else if (in_section) print; }' genome.txt

답변4

음, awk에서 시작한다면 다음을 시도해 보세요:

echo ">genome.1";awk 'BEGIN{RS=">"}{if($1 == "genome.1"){for(i=1;i<NF;i++){print $(i+1)}}}' file |sort -u

RS=">"실행 중인 각 "게놈" 레코드를 분리하여 각 레코드의 모든 필드를 인쇄하되 sort고유한 출력 목록(매개변수 -u)을 먼저 인쇄합니다. 설정하면 RS=">genome\."짧게 작성할 수 있습니다.

echo -n ">genome.";awk 'BEGIN{RS=">genome."}/1/{print $0}' file |sort -ur

관련 정보