내 문제는 다음과 비슷합니다이것, 그러나 추출하려는 부분이 해당 행 내에 있으므로 출력이 아닌 원본 파일의 새로 생성된 열에도 저장하고 싶습니다.
탭으로 구분된 파일의 한 줄은 다음과 같습니다.
chr1 25228613 25229157 CDS HAVANA . - 2 ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig
$9에서 "gene_name" 이후의 내용을 추출하고 싶습니다. 이 줄은 RUNX3입니다.
예상 출력:
chr1 25228613 25229157 CDS HAVANA . - 2 ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig RUNX3
awk나 sed를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
이제 구분 기호를 알았으니 해당 구분 기호를 분할하고 다시 그룹화하세요.
sed -Ei 's/(.*gene_name=)([^;]*)(;.*)/\1\2\3\t\2/g' gene
으로 나누어져 있어요
(.*gene_name=)
gene_name 태그까지의 모든 문자열은 변수 1에 들어갑니다.
([^;]*)
; 변수 2에 들어가기 전의 모든 연속 문자
(;.*)
문자열의 나머지 부분은 변수 3에 들어갑니다.
\1\2\3\t\2
탭과 추가된 유전자를 사용하여 문자열을 재조립합니다.
편집하다
아니면 @Weijun이 말했듯이
\0\t\2
다른 편집자
코드 골프
sed -Ei 's/.*gene_name=([^;]*).*/\0\t\1/g' gene
답변2
그리고 gawk
:
gawk 'match($9,/^.*gene_name=([^;]*);.*/,arr) {print $0"\t"arr[1]}'
그러면 "gene_name=" 문자열이 포함된 각 줄의 끝에 gene_name이 추가됩니다. 필요에 따라 세부적으로 조정할 수 있습니다.
답변3
다음 내용 awk
도 도움이 될 수 있습니다.
awk '{val=$0;sub(/.*gene_name=/,"",val);sub(/\;.*/,"",val);print $0,val}' Input_file
답변4
awk
다음은 파일의 속성 필드(탭으로 구분된 9번째 필드)에서 특정 이름의 필드를 구문 분석하는 일반적인 솔루션 입니다.일반 기능 형식(GFF):
BEGIN { OFS = FS = "\t" }
function get_attrib_by_name(key, n,attrib,kv) {
# Split the attribute field on semi-colons.
n = split($9, attrib, ";")
# Loop over the attributes and split each on "=".
# When we've found the one we're looking for (by key name in "key"),
# return the corresponding value.
for (i = 1; i <= n; ++i) {
split(attrib[i], kv, "=")
if (kv[1] == key) {
return kv[2]
}
}
}
# Using the above function.
{
name = get_attrib_by_name("gene_name")
print $0, name
}
이것은 다음과 같이 사용될 것입니다
$ awk -f script.awk file.gff
script.awk
위의 스크립트는 어디에 있습니까?