파일에 게놈 데이터가 있는데, 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.1
s입니다. 대규모 데이터 세트에서 모든 중복 항목을 제거할 필요가 없도록 이 작업을 올바르게 수행하려면 어떻게 해야 합니까?
답변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