Compter le nombre d’occurrences différentes dans une chaîne par UNIX le long d’une colonne dans un fichier

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