Recherche de tag: tsv


Compter le nombre de lignes en fonction du contenu d'une colonne [Bash]

07.08.2018     anicolas      comptage occurence tsv 

  
Exemple
Vous voulez compter le nombre d'occurence de chaque type, à partir du fichier tabulé suivant :
id value type
1 5698 typeA
2 569 typeB
3 3658 typeC
4 532 typeB
5 123 typeA

Vous obtenez :
typeA 2
typeB 2
typeC 1

Usage :
Le fichier tabulé doit avoir une ligne avec les noms de colonnes
Pour le lancer
./count_file.sh fichier_tabulé.txt numero_de_colonne_à_compter
#!/bin/bash
#s'il manque un argument, le script n'est pas lance
if [ $# -ne 2 ]; then echo 'Syntaxe: count_file.sh DE_file_with_annot.txt column_number_to_count'; exit 66; fi

#ecrit un fichier temporaire sans les noms de colonnes
tail -n +2 $1 >> $1.temp
#recupere le prefixe du nom de fichier pour ecrire le nom du fichier de sortie
prefix=$(basename $1 .txt)
output=$prefix"_column_num_"$2"_count.txt"
#creation du fichier de sortie et du fichier temporaire de sortie
temp="temp.txt"
touch $output
touch $temp

#lecture du fichier tabule ligne par ligne
while read line
do
#recupere la valeur de la colonne a compter
current_value=`echo "$line" | awk -F $"\t" '{print $'$2'}'`
#cherche dans le fichier de sortie si cette valeur existe. Si elle existe, augmente d'un le compteur pour cette valeur. Si elle n'existe pas, elle est cree et son compteur est initie a 1. Ecrit l'ancien fichier de sortie + les nouvelles infos dans un fichier temporaire
awk -F $"\t" -v value="$current_value" 'BEGIN{ OFS = FS ; found = "no"} {if( $1 == value ) {print $1, $2+1 ; found = "ok"} else {print $0}} END {if (found == "no") {print value, 1} }' $output >> $temp
#remplace le fichier de sortie par le fichier temporaire
mv $temp $output
done<$1.temp

#efface le fichier tabule sans les noms de colonnes
rm $1.temp
1/5 - [1 rating]