다음과 같은 열이 있는 파일(bigfile.txt)이 있습니다.
NW_017095471.1 Gnomon mRNA 108321 109565 . + . ID=rna34;Parent=gene27;Dbxref=GeneID:108565285,Genbank:XM_017925071.1;Name=XM_017925071.1;gbkey=mRNA;gene=LOC108565285;model_evidence=Supporting evidence includes similarity to: 7 Proteins%2C and 100%25 coverage of the annotated genomic feature by RNAseq alignments%2C including 30 samples with support for all annotated introns;product=transmembrane protein 126A;transcript_id=XM_017925071.1
ID=gene27;Dbxref=GeneID:108565285;Name=LOC108565285;gbkey=Gene;gene=LOC108565285;gene_biotype=protein_coding
ID=gene28;Dbxref=GeneID:108569527;Name=LOC108569527;gbkey=Gene;gene=LOC108569527;gene_biotype=protein_coding
ID=gene78;Dbxref=GeneID:108562956;Name=LOC108562956;gbkey=Gene;gene=LOC108562956;gene_biotype=protein_coding
별도의 목록이 있습니다.
gene27
gene28
각 행을 가져오고 ID 필드에 대해 grep을 수행하고 "Name=" 뒤에 "LOC#"을 반환하고 싶습니다.
gene=$line
`grep $gene";" bigfile.txt | sed -e 's/Name=
반품
LOC108565285
LOC108569527
이 부분을 어떻게 추출할 수 있나요?
답변1
이것이 탭으로 구분된 9번째 필드라고 가정해 보겠습니다.GFF 파일gene
(속성 필드) 다음을 사용하여 특정 속성(별도의 파일에서 읽음)에 해당하는 속성 값을 추출할 수 있습니다 .ID
awk
BEGIN { FS = "\t" }
FNR == NR {
# Read IDs into a hash as keys.
ids[$1] = 1
next
}
$3 == "gene" {
# Split the attribute field into separate key-value pairs.
n = split($9, keyvalues, ";")
id = "" # Not found a gene ID yet
gene = "" # No gene name to print
# Loop over the key-value pairs, split them on the "="
# and extract the gene name and gene ID.
for (i = 1; i <= n; ++i) {
split(keyvalues[i], attr, "=")
if (attr[1] == "ID") {
if (attr[2] in ids)
id = attr[2]
else
next # This line is not of interest
}
else if (attr[1] == "gene")
gene = attr[2]
}
if (id != "" && gene != "")
print gene
}
file.gff
열 9에 지정된 데이터와 다음 위치에 있는 유전자 ID 목록을 포함하는 GFF 파일에서 이를 실행합니다 id.list
.
$ awk -f script.awk id.list file.gff
LOC108565285
LOC108569527
유전자 ID 목록은 FNR == NR
코드 블록의 첫 번째 파일에서 읽히는 awk
반면, 마지막 블록은 명령줄에 제공된 두 번째(및 모든 후속) 파일에 있는 유전자 특징 줄의 속성 필드를 처리합니다.
코드 awk
에서는 GFF 파일 ID
과 gene
속성에 단일 값만 포함되어 있고(쉼표로 구분된 값 목록이 아님) 해당 값이 인용되지 않은 것으로 가정합니다.
유전자 이름 및 유전자 ID 목록(두 개의 열)으로 출력하려면 명령문을 print gene
로 변경하십시오 print id, gene
.
답변2
이를 위해서는 리팩토링이 필요하지만 원하는 작업을 수행해야 합니다.
while IFS=; read -r line; do grep -Fw "$line" biffile.txt; done < other_file | awk -F';' '{split($3,a,"=");print a[2]}'
답변3
나는 약간 다른 접근법을 사용할 것입니다. 먼저 ID 및 이름 필드만 추출합니다.
$ sed -nE 's/.*ID=([^;]*).*Name=([^;]*).*/\1 \2/p' file1
gene27 LOC108565285
gene28 LOC108569527
gene78 LOC108562956
그런 다음 대상 ID 목록을 사용하여 필터링합니다.
$ cat file2
gene27
gene28
$ sed -nE 's/.*ID=([^;]*).*Name=([^;]*).*/\1 \2/p' file1 | grep -wf file2
gene27 LOC108565285
gene28 LOC108569527
또는 값만 원 LOC....
하고 GNU가 있다고 가정하는 경우 grep
:
$ grep -wf file2 file1 | grep -oP 'Name=\K[^;]+'
LOC108565285
LOC108569527
답변4
아래의 간단한 스크립트로 완료
주문하다
for i in `cat file2`; do awk -v i="$i" -F ";" '$1=="ID="i{print $5}' file1| awk -F "=" '{print $NF}'; done
산출
LOC108565285
LOC108569527