次のファイルがあります。
ID101 G T freq=.5 nonetype ANC=.1 addinfor
ID102 A T freq=.3 ANC=.01 addinfor
ID102 A T freq=.01 type=1 ALT=0.022 ANC=.02 addinfor
ご覧のとおり、各行にはわずかに異なる列数があります。特に、列1、列2、列3、列4以上が必要です。ANC=
希望の出力:
ID101 G T freq=.5 ANC=.1
ID102 A T freq=.3 ANC=.01
ID102 A T freq=.01 ANC=.02
私は通常、awkコマンドを使用してファイルを解析します。
awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}'
この状況に合わせてこのコマンドを変更する簡単な方法はありますか?
私の考えには次のようなものが効果があるようです。
awk '{for(j=1;j<=NF;j++){if($j~/^ANC=/){print $j}}}'
しかし、最初の列を印刷するにはどうすれば編集できますか?
答え1
そしてawk
:
awk '{for(i=5;i<=NF;i++){if($i~/^ANC=/){a=$i}} print $1,$2,$3,$4,a}' file
for(...)
i=5
フィールド5()から始めて、すべてのフィールドを繰り返します。if($i~/^ANC=/)
フィールドが次から始まることを確認してください。ANC=
a=$i
その場合は、変数aをその値に設定します。
print $1,$2,$3,$4,a
フィールド1-4を印刷してから、保存した内容を印刷しますa
。
BEGIN {OFS="\t"}
もちろん結合も可能です。
答え2
このANC=
列は常に最後の列から2番目の列であると仮定します(例データに表示されます)。
$ awk '{ print $1, $2, $3, $(NF-1) }' data.in
ID101 G T ANC=.1
ID102 A T ANC=.01
ID102 A T ANC=.02
NF
awk
各レコード(行)が分割されるフィールド(列)の数。$(NF-1)
2 番目のフィールドの値です。
答え3
perl -pale '$"="\t", $_="@{[@F[0..3], grep { /^ANC=/ } @F[4..$#F]]}"' yourfile
perl -lane '$,="\t", print @F[0..3], grep { /^ANC=/ } @F[4..$#F]' yourfile
perl -lane '($,,$a)=("\t",0), print grep { $a++ < 4 or /^ANC=/ } @F' yourfile
単に
$, => OFS
@F[0..3]
=>$F[0] $F[1] $F[2] $F[4]