Je voudrais compter le nombre de fois où apparaissent les différentes sous-chaînes dans un ensemble de chaînes de la deuxième colonne d’un fichier tabulaire. Donc, de cette façon, je fais un split pour séparer chaque sous-chaîne et ensuite essayer de les compter. Cependant, ne fonctionne pas correctement.
L’entrée est comme
rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA AA
La sortie souhaitée
rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA AA=9;AC=2 rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA CC AA=10;CC=1
etc….
awk 'BEGIN {FS=OFS="\t"} {gf=split($2,gfp," ")} {for (i=1;i output
et aussi j’essaie de faire un autre script mais je pense que le fait de répéter chaque compte compte le même nombre de fois que cela se produit pour chaque ligne. Ici, j’ai effectué une scission sous la première division pour discerner les sous-chaînes
awk 'BEGIN {FS=OFS="\t"} {gf=split($2,gfp," ");} {for (i=1;i output
Je suis sûr qu’il existe des moyens plus faciles de le faire, mais je ne peux pas résoudre complètement. Est-il possible de faire dans un environnement UNIX? Merci d’avance
Votre entrée ne correspond pas à votre sortie donc nous sums tous en train de deviner mais cela pourrait être ce que vous voulez:
$ cat tst.awk BEGIN { FS=OFS="\t" } { delete cnt split($2,tmp,/ /) for (i in tmp) { str = tmp[i] cnt[str]++ } printf "%s", $0 sep = OFS for (str in cnt) { printf "%s%s=%d", sep, str, cnt[str] sep = ";" } print "" }
Selon ce que votre consortingbution est vraiment ce qui précède va sortir ce qui suit:
$ cat file rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA AA $ awk -f tst.awk file rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA AA=9;AC=2 rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA AA AA=11 $ cat file rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA CC $ awk -f tst.awk file rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA AA=9;AC=2 rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA CC AA=10;CC=1
quelque chose comme ça?
$ awk '{for(i=4;i<=NF;i++) c[$i]++; for(k in c) {s=s sep k"="c[k]; sep=";"; c[k]=0} $NF=$NF OFS s; s=sep=""}1' file | column -t rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA AA=9;AC=2 rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA AA AA=11;AC=0
Notez que les lettres capturées augmentent progressivement puisque seules les clés observées jusqu'à une ligne seront imprimées. Par exemple, si vous avez CC
dans la deuxième ligne, le compte ne sera pas répertorié dans la première ligne.
Pourrait le faire en perl
perl -lpe '$a{$_}++ for /\b[AZ]{2}\b/g; $_.=" ".join(";",map{"$_=$a{$_}"}keys%a); %a = map{$_=>0}keys%a' file
produit
rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA AA=9;AC=2 rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA CC AA=10;CC=1;AC=0
Pour nouvelle exigence
perl -lpe '$a{$_}++ for /\b[AZ]{2}\b/g; $_.=" ".join(";",map{"$_=$a{$_}"}keys%a); undef %a' file
produit
rs12255619 A/C chr10 AA AA AC AA AA AA AA AA AA AC AA AC=2;AA=9 rs7909677 A/G chr10 AA AA AA AA AA AA AA AA AA AA CC CC=1;AA=10
#!/bin/bash ssortingngs="AA AC CC" while read line; do echo -n "$line: " for name in $ssortingngs; do num=$(echo $line | xargs -n1 | grep -cw $name) if [[ $num -ne 0 ]]; then echo -n "$name=$num;" fi done echo done < inputFile.txt