J'ai un fichier de délimitation d'onglet

NC_044998.1     3778    0       CC      0       CC      0       CC      0       CC      1       CT      0       CC      0       CC      0       CC      0       CC      1       CT      0      CC       var     heterozygous    varvar  9       0.818182        2       0.181818        refref  refref  refref  refref  refdev  refref  refref  refref  refref  refdev  refref  homo    homo   homo     homo    het     homo    homo    homo    homo    het     homo    9       0       2       0       9       2
NC_044998.1     3787    0       CC      0       CC      1       CG      0       CC      0       CC      0       CC      0       CC      0       CC      0       CC      0       CC      0      CC       var     heterozygous    varvar  10      0.909091        1       0.0909091       refref  refref  refdev  refref  refref  refref  refref  refref  refref  refref  refref  homo    homo   het      homo    homo    homo    homo    homo    homo    homo    homo    10      0       1       0       10      1

Où les colonnes $32-$43 ont un type d'informations (ref / dev) et les colonnes $43-$54 une autre (homo / het) Je veux les combiner pour que col $32 soit fusionné avec le col à $32 + 11 = $43 et ajouté à la fin du fichier, puis déplacez i + 1, de sorte que $33$44 est fusionné et ajouté, puis $34$45, et ainsi de suite. La sortie ressemblerait à

NC_044998.1     3778    0       CC      0       CC      0       CC      0       CC      1       CT      0       CC      0       CC      0       CC      0       CC      1       CT      0      CC       var     heterozygous    varvar  9       0.818182        2       0.181818        refref  refref  refref  refref  refdev  refref  refref  refref  refref  refdev  refref  homo    homo   homo     homo    het     homo    homo    homo    homo    het     homo    9       0       2       0       9       2   refrefhomo  refrefhomo  refrefhomo  refrefhomo  refdevhet  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refdevhet refrefhomo
NC_044998.1     3787    0       CC      0       CC      1       CG      0       CC      0       CC      0       CC      0       CC      0       CC      0       CC      0       CC      0      CC       var     heterozygous    varvar  10      0.909091        1       0.0909091       refref  refref  refdev  refref  refref  refref  refref  refref  refref  refref  refref  homo    homo   het      homo    homo    homo    homo    homo    homo    homo    homo    10      0       1       0       10      1   refrefhomo  refrefhomo  refdevhet  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo

Je peux un par un

 cut -f32,43 file | sed 's/ //g' | paste file - > file.tmp

Mais il génère 11 fichiers tmp

1
Madza Farias-Virgens 29 oct. 2020 à 23:13

2 réponses

Meilleure réponse

Vous pouvez essayer ceci awk:

awk 'BEGIN {
   FS=OFS="\t"
}
{
   for (i=32; i<43; ++i)
      $0 = $0 OFS $i $(i+11)
} 1' file
NC_044998.1 3778    0   CC  0   CC  0   CC  0   CC  1   CT  0   CC  0   CC  0   CC  0   CC  1   CT  0   CC  var heterozygous    varvar  9   0.818182    2   0.181818    refref  refref  refref  refref  refdev  refref  refref  refref  refref  refdev  refref  homo    homo    homo    homo    het homo    homo    homo    homo    het homo    9   0   2   0   9   2   refrefhomo  refrefhomo  refrefhomo  refrefhomo  refdevhet   refrefhomo  refrefhomo  refrefhomo  refrefhomo  refdevhet   refrefhomo
NC_044998.1 3787    0   CC  0   CC  1   CG  0   CC  0   CC  0   CC  0   CC  0   CC  0   CC  0   CC  0   CC  var heterozygous    varvar  10  0.909091    1   0.0909091   refref  refref  refdev  refref  refref  refref  refref  refref  refref  refref  refref  homo    homo    het homo    homo    homo    homo    homo    homo    homo    homo    10  0   1   0   10  1   refrefhomo  refrefhomo  refdevhet   refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo  refrefhomo
1
anubhava 29 oct. 2020 à 20:20

Surtout logique, une réponse comme celle de @anubhava monsieur. Avec des variables et une petite logique supplémentaire d'ajout de chiffres à la fin de la ligne avec la différence du numéro de champ maximum avec le numéro de champ de départ.

awk -v startFieldnum="32" -v tillFieldnum="43" '
BEGIN{
   FS=OFS="\t"
   diff=(tillFieldnum-startFieldnum)
}
{
   for (i=startFieldnum; i<tillFieldnum ; ++i)
      $0 = $0 OFS $i $(i+diff)
} 1' Input_file
1
RavinderSingh13 29 oct. 2020 à 21:25