Stampa colonne che iniziano con una stringa specifica


11

Ho un file che assomiglia a questo:

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

Come puoi vedere, ogni riga ha un numero leggermente diverso di colonne. Voglio specificamente la colonna 1, la colonna 2, la colonna 3, la colonna 4 e la colonna che inizia conANC=

Uscita desiderata:

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

In genere utilizzo il comando an awk per analizzare i file:

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

C'è un modo semplice per modificare questo comando per lavorare in situazioni come questa?

Penso che qualcosa del genere potrebbe funzionare:

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

Tuttavia, come posso modificarlo per stampare anche le prime colonne?

Risposte:


15

Con awk:

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

  • for(...)scorre attraverso tutti i campi, iniziando dal campo 5 ( i=5).
    • if($i~/^ANC=/) controlla se il campo inizia con ANC=
    • a=$i se sì, imposta la variabile a su quel valore
  • print $1,$2,$3,$4,acampi di stampa 1-4 seguiti da qualunque cosa sia memorizzata a.

Può essere combinato con BEGIN {OFS="\t"}ovviamente.


cosa fa i=5?
Cosmictypist,

@ stellar01 questo avvia il ciclo sul campo numero 5.
caos

0

Supponendo che la ANC=colonna sia sempre la penultima (come nei dati di esempio):

$ 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è il numero di campi (colonne) che awkdivide ogni record (riga) in. $(NF-1)è il valore del penultimo campo.


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

Breve

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.