Cetak kolom yang dimulai dengan string tertentu


11

Saya memiliki file yang terlihat seperti ini:

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

Seperti yang Anda lihat, setiap baris memiliki jumlah kolom yang sedikit berbeda. Saya secara khusus menginginkan kolom 1, kolom 2, kolom 3, kolom 4 dan kolom yang dimulai denganANC=

Output yang diinginkan:

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

Saya biasanya menggunakan perintah awk untuk mem-parsing file:

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

Apakah ada cara mudah untuk mengubah perintah ini agar berfungsi untuk situasi seperti ini?

Saya pikir sesuatu seperti ini mungkin berhasil:

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

Namun, bagaimana saya bisa mengedit ini untuk juga mencetak kolom pertama?

Jawaban:


15

Dengan awk:

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

  • for(...)loop melalui semua bidang, dimulai dengan bidang 5 ( i=5).
    • if($i~/^ANC=/) memeriksa apakah bidang dimulai dengan ANC=
    • a=$i jika ya, setel variabel a ke nilai itu
  • print $1,$2,$3,$4,abidang cetak 1-4 diikuti oleh apa pun yang disimpan di a.

Bisa dipadukan dengan BEGIN {OFS="\t"}tentunya.


apa yang i=5dilakukan?
cosmictypist

@ stellar01 ini memulai perulangan di bidang nomor 5.
kekacauan

0

Dengan asumsi bahwa ANC=kolom selalu merupakan kolom kedua-terakhir (seperti pada contoh data):

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

NFadalah jumlah bidang (kolom) yang awkmembagi setiap rekaman (baris) menjadi. $(NF-1)adalah nilai dari bidang kedua ke terakhir.


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

Singkat

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.