2010-08-17 5 views
31

J'ai un fichier texte avec une grande quantité de données qui est délimité par des tabulations. Je veux regarder les données de telle sorte que je puisse voir les valeurs uniques dans une colonne. Par exemple,Comment compter le nombre de valeurs uniques d'un champ dans un fichier texte délimité par des tabulations?

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

Ainsi, son comme la première colonne a des couleurs, donc je veux savoir combien de différentes valeurs uniques sont là dans cette colonne et je veux être en mesure de le faire pour chaque colonne.

Je dois le faire dans une ligne de commande Linux, donc probablement en utilisant un script bash, sed, awk ou autre chose.

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 est d'avoir un compte de "chacune" de ces valeurs uniques, mais je ne sais pas combien de valeurs uniques sont là. Par exemple, dans la première colonne, je veux savoir combien d'objets de couleur rouge, bleu, vert, etc sont là.

+5

'uniq -c' compte par élément. –

+0

@Dennis merci, c'est ce dont j'avais besoin. J'aime vraiment la puissance et la simplicité de la ligne de commande Linux. Besoin de commencer à l'apprendre correctement :). – sfactor

Répondre

65

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

cat input_file | cut -f 1 | sort | uniq 

obtient des valeurs uniques dans le champ 1, en remplaçant 1 par 2 vous donnera des valeurs uniques dans le champ 2.

Éviter UUOC :)

cut -f 1 input_file | sort | uniq 

EDIT:

Pour compter le nombre d'occurences uniques que vous pouvez utiliser la commande wc dans la chaîne comme:

cut -f 1 input_file | sort | uniq | wc -l 
+5

vous pouvez également utiliser 'sort -u' au lieu de' sort | uniq' – Hasturkun

+18

'uniq -c' donnera les décomptes par item -' wc -l' comptera le nombre total d'items. –

+2

+1 Merci @codaddict et al. 'uniq -c' était le dernier morceau dont j'avais besoin ... – hafichuk

8

Vous pouvez utiliser awk, trier & uniq pour ce faire, par exemple à la liste tous les uniques les valeurs de la première colonne

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

Comme affiché ailleurs, si vous voulez compter le nombre de cas de quelque chose que vous pouvez diriger la liste unique de wc -l

2

En supposant que le fichier de données est en fait séparées par des tabulations, pas d'espace aligné:

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

Où 4 $ sera:

  • 1 $ - Red
  • $ 2 - Boule
  • $ 3 - 1
  • 4 $ - Vendu
2
# COLUMN is integer column number 
# INPUT_FILE is input file name 

cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l 
5
cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } ' 
0

Voici un script bash qui répond entièrement à la question initiale (révisée). C'est, donné tout.Fichier tsv, il fournit le synopsis pour chacune des colonnes à tour de rôle. En dehors de bash lui-même, il n'utilise que des outils standard * ix/Mac: sed tr wc cut sort uniq.

#!/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

Ce script affiche le nombre de valeurs uniques dans chaque colonne d'un fichier donné. Il suppose que la première ligne du fichier donné est la 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 

exécution Exemple:

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

sortie Exemple

isRef A_15  C_42  G_24  T_18 
isCar YEA_10 NO_40 NA_50 
isTv  FALSE_33 TRUE_66 
Questions connexes