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à.
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
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
cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } '
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:
# COLUMN is integer column number
# INPUT_FILE is input file name
cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l
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
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