web-dev-qa-db-fra.com

Comment compter le nombre de valeurs uniques d'un champ dans un fichier texte délimité par des tabulations?

J'ai un fichier texte avec une grande quantité de données délimité par des tabulations. Je souhaite examiner les données de manière à pouvoir afficher les valeurs uniques dans une colonne. Par exemple,

Red     Ball 1 Sold
Blue    Bat  5 OnSale
............... 

Donc, comme la première colonne a des couleurs, je veux savoir combien de valeurs uniques différentes se trouvent dans cette colonne et je veux pouvoir le faire pour chaque colonne.

Je dois le faire dans une ligne de commande Linux, donc probablement avec un script bash, sed, awk ou quelque chose du genre.

Addendum: Merci à tous pour l'aide, puis-je demander une dernière chose? Et si je voulais aussi compter ces valeurs uniques?

Je suppose que je n'ai pas mis la deuxième partie assez clairement. Ce que je voulais faire, c'est avoir un compte de "chacune" de ces valeurs uniques sans savoir combien il en existe. Par exemple, dans la première colonne, je veux savoir combien d’objets colorés rouge, bleu, vert, etc. sont là.  

33
sfactor

Vous pouvez utiliser les commandes cut, sort et uniq comme suit:

cat input_file | cut -f 1 | sort | uniq

obtient des valeurs uniques dans le champ 1, le remplacement de 1 par 2 vous donnera des valeurs uniques dans le champ 2.

Éviter UUOC :)

cut -f 1 input_file | sort | uniq

MODIFIER:

Pour compter le nombre d'occurrences uniques, vous pouvez utiliser la commande wc dans la chaîne en tant que:

cut -f 1 input_file | sort | uniq | wc -l
69
codaddict

Vous pouvez utiliser awk, sort & uniq pour le faire, par exemple pour lister toutes les valeurs uniques dans la première colonne

awk < test.txt '{print $1}' | sort | uniq

Comme posté ailleurs, si vous voulez compter le nombre d'instances de quelque chose, vous pouvez diriger la liste unique vers wc -l

8
Jon Freedman
cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } '
7
Mike

En supposant que le fichier de données est en fait séparé par des tabulations et non par des espaces:

<test.tsv awk '{print $4}' | sort | uniq

Où 4 $ seront:

  • 1 $ - rouge 
  • 2 $ - balle 
  • $ 3 - 1 
  • 4 $ - vendu
2
Douglas Leeder
# COLUMN is integer column number
# INPUT_FILE is input file name

cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l
2
stacker

Voici un script bash qui répond pleinement à la question initiale (révisée). C'est-à-dire que, compte tenu de tout fichier .tsv, il fournit le synopsis de chacune des colonnes. Hormis bash, il n’utilise que des outils * ix/Mac standard: un format unique et un format unique.

#!/bin/bash
# Syntax: $0 filename   
# The input is assumed to be a .tsv file

FILE="$1"

cols=$(sed -n 1p $FILE | tr -cd '\t' | wc -c)
cols=$((cols + 2 ))
i=0
for ((i=1; i < $cols; i++))
do
  echo Column $i ::
  cut -f $i < "$FILE" | sort | uniq -c
  echo
done
0
peak

Ce script génère le nombre de valeurs uniques dans chaque colonne d'un fichier donné. Il suppose que la première ligne d'un fichier donné est une ligne d'en-tête. Il n'est pas nécessaire de définir le nombre de champs. Enregistrez simplement le script dans un fichier bash (.sh) et fournissez le fichier délimité par des tabulations en tant que paramètre de ce script.

Code

#!/bin/bash

awk '
(NR==1){
    for(fi=1; fi<=NF; fi++)
        fname[fi]=$fi;
} 
(NR!=1){
    for(fi=1; fi<=NF; fi++) 
        arr[fname[fi]][$fi]++;
} 
END{
    for(fi=1; fi<=NF; fi++){
        out=fname[fi];
        for (item in arr[fname[fi]])
            out=out"\t"item"_"arr[fname[fi]][item];
        print(out);
    }
}
' $1

Exemple d'exécution:

bash> ./script.sh <path to tab-delimited file>

Exemple de sortie

isRef    A_15      C_42     G_24     T_18
isCar    YEA_10    NO_40    NA_50
isTv     FALSE_33  TRUE_66
0
Amin.A