전문가: 문자열(부분 및 정확한)을 기반으로 필드를 추출하고 싶습니다.일부 행에서 이러한 필드는 한 열 또는 두 열 이동되었습니다., 그래서 열을 지정할 수 없습니다(이것은 제가 아는 범위입니다). 또한 필드 1, 2, 4, 5를 추출해야 하지만 이는 행마다 변경되지 않으므로 직접 수행할 수 있습니다.
특히 부분 문자열 "DP4=" 및 "와 같은 문자열이 일치하는 필드쉬움"왼쪽 및 오른쪽 필드 추가:
입력하다:
NW_006532014.1 603822 . T C 222.0 . DP=103 ADF=30,22 ADR=13,16 AD=43,38 VDB=0.0570121 SGB=-0.693143 RPB=0.810487 MQB=0.570226 MQSB=0.033126 BQB=0.964281 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=30,13,22,16 MQ=35 ANN=C missense_variant MODERATE ABCB6 ABCB6 transcript XM_007419806.2
NW_006532015.1 1015800 . AAA AAACAA 228.0 . INDEL IDV=106 IMF=0.905983 DP=117 ADF=6,50 ADR=19,42 AD=25,92 VDB=0.22041 SGB=-0.693147 MQSB=0.182586 MQ0F=0 AC=2 AN=2 DP4=6,19,50,42 MQ=36 ANN=AAACAA disruptive_inframe_insertion MODERATE CEP131 CEP131 transcriptXM_025166060.1 protein_coding 11/27
NW_006532017.1 910856 . C G 78.0 . DP=118 ADF=50,14 ADR=25,2 AD=75,16 VDB=0.954018 SGB=-0.689466 RPB=0.939107 MQB=0.0031569 MQSB=0.280595 BQB=0.0859367 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=50,25,14,2 MQ=44 ANN=G missense_variant MODERATE HPS1 HPS1 transcript XM_025169525.1
NW_006532033.1 475415 . T C 222.0 . DP=123 ADF=18,36 ADR=18,15 AD=36,51 VDB=0.984451 SGB=-0.693147 RPB=0.428811 MQB=1.68713e-05 MQSB=0.565818 BQB=0.837943 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=18,18,36,15 MQ=41 ANN=C missense_variant MODERATE PTCH2 PTCH2 transcript XM_025164053.1
NW_006532040.1 586236 . G C 29.9689 . DP=106 ADF=40,9 ADR=25,1 AD=65,10 VDB=0.731987 SGB=-0.670168 RPB=0.945403 MQB=0.00509228 MQSB=0.210814 BQB=0.365756 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=40,25,9,1 MQ=46 ANN=C missense_variant MODERATE OMG OMG transcript XM_007420376.3
NW_006532040.1 674528 . T C 221.0 . DP=128 ADF=39,15 ADR=19,9 AD=58,24 VDB=0.253732 SGB=-0.692831 RPB=0.952839 MQB=1.09944e-10 MQSB=0.755937 BQB=0.749586 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=39,19,15,9 MQ=48 ANN=C missense_variant MODERATE NF1 NF1 transcript XM_007420379.3
원하는 출력(탭으로 구분):
DP4=30,13,22,16 missense_variant MODERATE ABCB6
DP4=6,19,50,42 disruptive_inframe_insertion MODERATE CEP131
DP4=50,25,14,2 missense_variant MODERATE HPS1
DP4=18,18,36,15 missense_variant MODERATE PTCH2
DP4=40,25,9,1 missense_variant MODERATE OMG
DP4=39,19,15,9 missense_variant MODERATE NF1
감사해요!
답변1
match()
, \<
단어 경계 및 \s/\S
약어 에 대한 세 번째 인수로 GNU awk를 사용합니다 .
$ awk -v OFS='\t' 'match($0,/(\<DP4=\S+).*\s(\S+\tMODERATE\t\S+)/,a){print a[1], a[2]}' file
DP4=30,13,22,16 missense_variant MODERATE ABCB6
답변2
awk 'BEGIN{ OFS="\t" } {
nrf=split($0, tmp); s1=s2=0;
for(i=1; i<=nrf; i++){
printf "%s", (tmp[i] ~/DP4=/ &&++s1? (s2?OFS:"") tmp[i]:
(tmp[i]=="MODERATE" &&++s2? (s1?OFS:"") tmp[i-1] OFS tmp[i] OFS tmp[i+1]:"") );
}; print "";
}' infile
우리는 사용했었다분할() 함수현재 처리된 행을 매번 임시 배열로 분할합니다.tmp기본 FS(공백, 즉 탭/공백)에서 이것은 nrf
분할() 함수에 의해 분할된 필드 수를 보유하는 데 사용하는 임시 변수일 뿐입니다.
그런 다음 이 필드에 대해 for-look을 사용하고 현재 읽은 필드가 tmp[i]
원하는 조건을 만족하는지 확인하고, 그렇다면 인쇄하고, 그렇지 않으면 다음 조건을 확인하고, 표시되면 이전 필드를 인쇄합니다. tmp[i-1]
그런 다음 현재 필드 그 자체, tmp[i]
그 오른쪽의 다음 필드 tmp[i+1]
, 그렇지 않으면 빈 문자열을 인쇄합니다 ""
.
임시 변수s1
그리고s2
첫 번째와 두 번째 인쇄 조건 작업 사이의 필드 구분 기호를 제어하는 데 사용됩니다. 따라서 다음 필드 앞에 필드가 있으면 OFS 이전이 인쇄되어야 합니다.