専門家:文字列(部分的および正確な)に基づいてフィールドを抽出したいと思います。一部の行では、これらのフィールドは 1 列または 2 列移動されました。だから、列を指定することはできません(これは私が知っている範囲です)。また、フィールド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
3番目の引数として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
最初と2番目の印刷条件ジョブの間のフィールド区切り記号を制御するために使用されます。したがって、次のフィールドの前にフィールドがある場合は、OFS 移行を印刷する必要があります。