특정 열에서 문자열 일부 추출

특정 열에서 문자열 일부 추출

입력으로 다음 파일이 있습니다.

chr1    HAVANA  exon    11869   12227   .   +   .   gene_id "ENSG00000223972.5_2"; transcript_id "ENST00000456328.2_1"; gene_type "transcribed_unprocessed_pseudogene"; gene_name "DDX11L1"; transcript_type "processed_transcript"; transcript_name "DDX11L1-002"; exon_number 1; exon_id "ENSE00002234944.1_1"; level 2; transcript_support_level 1; tag "basic"; havana_gene "OTTHUMG00000000961.2_2"; havana_transcript "OTTHUMT00000362751.1_1"; remap_original_location "chr1:+:11869-12227"; remap_status "full_contig";
chr1    HAVANA  exon    12010   12057   .   +   .   gene_id "ENSG00000223972.5_2"; transcript_id "ENST00000450305.2_1"; gene_type "transcribed_unprocessed_pseudogene"; gene_name "DDX11L1"; transcript_type "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-001"; exon_number 1; exon_id "ENSE00001948541.1_1"; level 2; transcript_support_level "NA"; ont "PGO:0000005"; ont "PGO:0000019"; tag "basic"; havana_gene "OTTHUMG00000000961.2_2"; havana_transcript "OTTHUMT00000002844.2_1"; remap_original_location "chr1:+:12010-12057"; remap_status "full_contig";

이는 탭으로 구분된 9열 파일입니다.

출력이 다음과 같이 되도록 열 1,4,5,7 및 열 9의 gene_name 부분을 인쇄하고 싶습니다.

chr1    11869   12227   +   DDX11L1
chr1    12010   12057   +   DDX11L1

awk와 sed 조합을 사용하려고 생각했지만 원하는 것을 얻을 수 없습니다

awk -v OFS="\t" -F "\t" '{print $1,$4,$5,$7,$9}' | sed 's/gene_name\s"\(.+\)";\stran*/\1/'

어떤 도움이라도 대단히 감사하겠습니다.

감사해요

답변1

GNU awk가 있는 경우 gensub대체에 적합한 정규 표현식을 사용할 수 있습니다. 예를 들어 모든 것이 gene_id탭으로 구분된 단일 필드 9라고 가정합니다.

gawk -F '\t' '{$9 = gensub(/.*gene_name "([^"]*)".*/,"\\1","1",$9); print $1,$4,$5,$7,$9}' input
chr1 11869 12227 + DDX11L1
chr1 12010 12057 + DDX11L1

답변2

여러 구분 기호와 함께 사용하세요 awk.

 awk -F"[\" \t]" '{print $1,$11,$14,$20,$40}' infile.txt 

답변3

awk구분 기호로 공백을 사용합니다.

이 시도:

$ awk '{print $1, $4, $5, $7, substr($16, 2, 7) }' file
chr1 11869 12227 + DDX11L1
chr1 12010 12057 + DDX11L1

관련 정보