Belirli bir dizeyle başlayan sütunları yazdırma


11

Ben böyle bir şey görünüyor bir dosya var:

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

Gördüğünüz gibi, her satırın biraz farklı sütun sayısı vardır. Özellikle sütun 1, sütun 2, sütun 3, sütun 4 ve ile başlayan sütunu istiyorumANC=

Istenilen çıktı:

ID101     G    T     freq=.5     ANC=.1
ID102     A    T     freq=.3     ANC=.01
ID102     A    T     freq=.01    ANC=.02

Genellikle dosyaları ayrıştırmak için bir awk komutunu kullanın:

awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}'

Bu gibi durumlarda çalışmak için bu komutu değiştirmenin kolay bir yolu var mı?

Bence böyle bir şey işe yarayabilir:

awk '{for(j=1;j<=NF;j++){if($j~/^ANC=/){print $j}}}'

Ancak, ilk sütunları da yazdırmak için bunu nasıl düzenleyebilirim?

Yanıtlar:


15

İle awk:

awk '{for(i=5;i<=NF;i++){if($i~/^ANC=/){a=$i}} print $1,$2,$3,$4,a}' file

  • for(...)alan 5 ( i=5) ile başlayarak tüm alanlarda döngüler oluşturur .
    • if($i~/^ANC=/) alanın başlayıp başlamadığını kontrol eder ANC=
    • a=$i evet ise, a değişkenini bu değere ayarlayın
  • print $1,$2,$3,$4,a1-4 alanları yazdırın ve ardından depolananları takip edin a.

BEGIN {OFS="\t"}Elbette ile birleştirilebilir .


ne gelmez i=5mi?
kozmiktypist

@ stellar01 Bu, 5. alandaki döngüyü başlatır.
chaos

0

ANC=Sütunun her zaman ikinci-son sütun olduğunu varsayarsak (örnek verilerdeki gibi):

$ awk '{ print $1, $2, $3, $(NF-1) }' data.in
ID101 G T ANC=.1
ID102 A T ANC=.01
ID102 A T ANC=.02

NFawkher kaydı (satırı) bölen alan (sütun) sayısıdır . $(NF-1)ikinci ile son arasındaki alanın değeridir.


0
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

Kısa

$, => OFS @F[0..3]=>$F[0] $F[1] $F[2] $F[4]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.