Imprimir columnas que comienzan con una cadena específica


11

Tengo un archivo que se parece a esto:

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

Como puede ver, cada línea tiene un número ligeramente diferente de columnas. Quiero específicamente la columna 1, la columna 2, la columna 3, la columna 4 y la columna que comienza conANC=

Salida deseada:

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

Generalmente uso el comando awk para analizar archivos:

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

¿Hay una manera fácil de alterar este comando para trabajar en situaciones como esta?

Creo que algo como esto podría funcionar:

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

Sin embargo, ¿cómo puedo editar esto para imprimir también las primeras columnas?

Respuestas:


15

Con awk:

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

  • for(...)recorre todos los campos, comenzando con el campo 5 ( i=5).
    • if($i~/^ANC=/) comprueba si el campo comienza con ANC=
    • a=$i en caso afirmativo, establezca la variable a en ese valor
  • print $1,$2,$3,$4,aimprime los campos 1-4 seguidos de lo que esté almacenado a.

Se puede combinar con, BEGIN {OFS="\t"}por supuesto.


lo que hace el i=5hacer?
cosmictypist

@ stellar01 esto inicia el ciclo en el campo número 5.
caos

0

Suponiendo que la ANC=columna es siempre la penúltima columna (como en los datos de ejemplo):

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

NFes el número de campos (columnas) que awkdivide cada registro (línea) en. $(NF-1)es el valor del penúltimo 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]

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.