Si j'ai un fichier texte avec le contenu suivant
red apple
green apple
green apple
orange
orange
orange
Existe-t-il une commande ou un script Linux que je peux utiliser pour obtenir le résultat suivant?
1 red apple
2 green apple
3 orange
Si j'ai un fichier texte avec le contenu suivant
red apple
green apple
green apple
orange
orange
orange
Existe-t-il une commande ou un script Linux que je peux utiliser pour obtenir le résultat suivant?
1 red apple
2 green apple
3 orange
Réponses:
Pouvez-vous vivre avec une liste alphabétique et ordonnée:
echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u
?
green apple
orange
red apple
ou
sort -u FILE
-u signifie unique et l'unicité n'est atteinte que par le tri.
Une solution qui préserve la commande:
echo "red apple
green apple
green apple
orange
orange
orange
" | { old=""; while read line ; do if [[ $line != $old ]]; then echo $line; old=$line; fi ; done }
red apple
green apple
orange
et, avec un fichier
cat file | {
old=""
while read line
do
if [[ $line != $old ]]
then
echo $line
old=$line
fi
done }
Les deux derniers suppriment uniquement les doublons, qui suivent immédiatement - ce qui correspond à votre exemple.
echo "red apple
green apple
lila banana
green apple
" ...
Imprime deux pommes, fendues par une banane.
Pour juste obtenir un compte:
$> egrep -o '\w+' fruits.txt | sort | uniq -c
3 apple
2 green
1 oragen
2 orange
1 red
Pour obtenir un décompte trié:
$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red
2 green
2 orange
3 apple
ÉDITER
Aha, ce n'était PAS le long des limites des mots, mon mal. Voici la commande à utiliser pour les lignes complètes:
$> cat fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red apple
2 green apple
2 orange
Voici un simple script python utilisant le type Counter . L'avantage est que cela ne nécessite pas de trier le fichier, en utilisant essentiellement zéro mémoire:
import collections
import fileinput
import json
print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))
Production:
$ cat filename | python3 script.py
{
"red apple": 1,
"green apple": 2,
"orange": 3
}
ou vous pouvez utiliser un simple one-liner:
$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
-d
note.