Imprimer les colonnes commençant par une chaîne spécifique

11

J'ai un fichier qui ressemble à ceci:

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

Comme vous pouvez le voir, chaque ligne a un nombre légèrement différent de colonnes. Je veux spécifiquement la colonne 1, la colonne 2, la colonne 3, la colonne 4 et la colonne qui commence parANC=

Sortie désirée:

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

J'utilise généralement la commande an awk pour analyser les fichiers:

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

Existe-t-il un moyen simple de modifier cette commande pour qu'elle fonctionne dans des situations comme celle-ci?

Je pense que quelque chose comme ça pourrait fonctionner:

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

Cependant, comment puis-je modifier cela pour imprimer également les premières colonnes?

cosmictypiste
la source

Réponses:

15

Avec awk:

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

  • for(...)boucle dans tous les champs, en commençant par le champ 5 ( i=5).
    • if($i~/^ANC=/) vérifie si le champ commence par ANC=
    • a=$i si oui, définissez la variable a sur cette valeur
  • print $1,$2,$3,$4,aimprimer les champs 1-4 suivis de tout ce qui est stocké a.

Peut être combiné avec BEGIN {OFS="\t"}bien sûr.

le chaos
la source
que fait- i=5il?
cosmictypist
@ stellar01 cela démarre la boucle au champ numéro 5.
chaos
0

En supposant que la ANC=colonne est toujours l'avant-dernière colonne (comme dans les données d'exemple):

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

NFest le nombre de champs (colonnes) qui awkdivise chaque enregistrement (ligne) en. $(NF-1)est la valeur de l'avant-dernier champ.

Kusalananda
la source
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

Bref

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


la source