Numéroté chaque ligne d’un fichier en fonction de la chaîne trouvée dans une colonne sous UNIX

Je voudrais numéroter un fichier de tabulation dépend de la chaîne dans la troisième colonne. Donc, si la troisième colonne est comme “X”, le numéro prend en compte un ensemble de colonnes et si est comme “Y” est numéroté en tenant compte des autres ensembles de colonnes et ainsi de suite. Dans ce cas, j’essaie de faire cela par le script ci-dessous en introduisant if conditions de différentes manières mais ne fonctionne pas correctement. Il serait possible de faire à travers le script ci-dessous? ou existe-t-il d’autres moyens plus simples de le faire dans un environnement UNIX? Merci d’avance.

L’entrée

rs868289783 355364 frameshift_variant * 1004 S del=1 dbSNP rs868289783 355364 frameshift_variant * 1004 S del=1 dbSNP 180595 chemical-modification R 18 DR PMD rs747393379 264033 deletion_inframe 108 del=12 dbSNP 296037 inframe_deletion NQMTGQISM 1405 del=9 ExAC 296037 inframe_deletion NQMTGQISM 348 del=9 ExAC 

La sortie serait

 1 rs868289783 355364 frameshift_variant * 1004 S del=1 dbSNP 1 rs868289783 355364 frameshift_variant * 1004 S del=1 dbSNP 2 180595 chemical-modification R 18 DR PMD 3 rs747393379 264033 deletion_inframe 108 del=12 dbSNP 4 296037 inframe_deletion NQMTGQISM 1405 del=9 ExAC 4 296037 inframe_deletion NQMTGQISM 348 del=9 ExAC 

Le script que j’ai utilisé est quelque chose comme

 awk 'function intern(sym) {{ if (sym in table && $3 ~/frameshift_variant/) return table[sym] return table[sym] = ++counter} { print intern($2"\t"$3"\t"$4"\t"$5"\t"$6), $0 }; else if (sym in table && $3 ~/inframe_deletion/) return table[sym] return table[sym] = ++counter} { print intern($2"\t"$3"\t"$4"\t"$7), $0 }; else if (sym in table && $3 ~/chemical-modification/) return table[sym] return table[sym] = ++counter} { print intern($2"\t"$3"\t"$4"\t"$5"\t"$6), $0 }; else if (sym in table && $3 ~/deletion_inframe/) return table[sym] return table[sym] = ++counter} { print intern($2"\t"$3"\t"$4"\t"$5"\t"$6), $0 }}' "input" > "output" 

awk à la rescousse!

 $ awk -F'\t' '!a[$3]++{c++} {print c FS $0}' file 

ou la version golfée

 $ awk '{print (!a[$3]++?++c:c)"\t"$0}' file 

plus loin

 $ awk '$0=(!a[$3]++?++c:c)"\t"$0' file 

Si je comprends un peu votre question, je pense que vous voulez faire quelque chose comme ceci:

 awk -F '\t' '($3=="frameshift_variant") { key=$2" "$3" "$4" "$5" "$6 if !(key in a01) { a01[key]=++c } print a01[key] OFS $0 next } ($3=="inframe_deletion") { key=$2" "$3" "$4" "$7 if !(key in a02) { a02[key]=++c } print a02[key] OFS $0 next } ($3==""} { key= if !(key in axx) { axx[key]=++c } print axx[key] OFS $0 next }' file 

Donc, tout ce dont vous avez réellement besoin est de construire une fonction keygen et vous pouvez alors faire

 awk -F '\t' 'function keygen() { if ($3 == "frameshift_variant") return $2" "$3" "$4" "$5" "$6 else if ($3 == "inframe_deletion") return $2" "$3" "$4" "$7 else if ($3 == "chemical-modification") return $2" "$3" "$4" "$5" "$6 else if ($3 == "deletion_inframe") return $2" "$3" "$4" "$5" "$6 } { key = keygen() if !(key in a) {a[key]=++c} print a[key] OFS $0 }' file