J'ai quelques commandes dans un script awk que j'écris:
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2}
Quelles sorties:
Here are some players and their numbers, sorted by last name
Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55
Comment puis-je utiliser la sort
commande dans mon script awk pour trier UNIQUEMENT les joueurs et leurs numéros?
command-line
text-processing
awk
KM142646
la source
la source
x
, puis définirPROCINFO["sorted_in"]
une valeur cryptique, puis sortez le tableau. Je n'irais pas là-bas.... | sort -k2,2
....| sort -k2,2
s'il y a d'autres lignes à imprimer? Vérifiez la question modifiée.echo
saisissant la ligne d'en-tête à partir du shell, puis exécutez leawk | sort
pipeline.Réponses:
vous pouvez ajouter
| sort -k2
à votre commande. Cela triera par ordre alphabétique en fonction de la deuxième colonne.Exemple:
résulte en
la source
{print x, $2}
directement dans le code de script? Je reçois une erreur lors de la tuyauterieif(sum[x] > 500) {print x, $2} | sort -k2
.if(sum[x] > 500) {print x, $2}
est du code Awk alors qu'il| sort -k2
s'agit d'une commande shell. Évidemment, vous ne pouvez pas mélanger les deux comme ça parce que ce sont des langues différentes. Au lieu de cela, vous devez appliquer lasort
commande à la sortie de l'interpréteur Awk qui exécute votre extrait de code Awk. Si vous ne savez pas ce que je veux dire, veuillez développer votre question pour nous donner une image complète../my-script.sh | sort -k2
. 2. ajoutez `| trier -k2` à la ligne de votre script qui produit la sortie donnée dans votre question.Bien que je ne le recommanderais pas (étant donné la relative simplicité de la transmission du résultat via une
sort
commande externe ), vous pouvez le faire au moins avec les versions récentes de GNU awk (au moins 4.0 IIRC), comme décrit dans Trier les valeurs et les indices de tableau avec gawkVoici comment vous pouvez l'implémenter, en supposant que vous avez les données dans un tableau associatif dans lequel se trouve l'index
Firstname Lastname
. Vous devez d'abord définir une fonction de comparaison personnalisée qui divise l'index, compare d'abordLastname
puis (comme un bris d'égalité) surFirstname
par exempleVous pouvez maintenant utiliser la
PROCINFO["sorted_in"]
méthode de tri des tableaux mentionnée dans les commentaires de @zwetsMettre ensemble
Essai:
Dans les versions antérieures ou inférieures de awk, votre meilleur pari peut être de stocker les données indexées à la
Lastname Firstname
place, de les trier avec le conventionnelasorti
, puis de diviser et d'échanger les champs des index lorsque vous parcourez le tableau pour l'imprimer:la source
Pour
sort
uniquement par le deuxième champ séparé par des espaces, utilisez la touche-k2,2
:par défaut
sort
fait le tri lexicographiquement.Notez que, si vous ne mentionnez pas le dernier champ pour la clé de tri, c'est-à-dire si vous utilisez simplement,
-k2
vous n'obtiendrez peut-être pas le résultat souhaité car cela dépendrasort
de tous les champs à partir de la seconde.Vérifiez également
man sort
.la source
Essayer
Où myscript.awk contient des commandes purement awk.
Si votre script réel est un script shell, vous avez plusieurs options, notamment
./myscript.bash | sort -k2
Réécrire le code en tant que fonction dans le script au
lieu de
Faire
Mais notez que vous pouvez également appliquer le tri à la structure do ... done au lieu de créer une fonction.
la source
Pour trier vos données à imprimer:
Supposons que vous souhaitiez imprimer le deuxième champ (séparé par des espaces), utilisez ceci:
par exemple:
Si vous souhaitez imprimer l'intégralité de votre
data.txt
mais trié sur la colonne 2, alors:Utilisez cette logique dans vos besoins.
Vous pouvez utiliser
man sort
pour des fonctionnalités plus intéressantes desort
.la source
qu'en est-il ci-dessous:
ça marche quand j'ai testé.
la source
Pour trier la sortie dans un fichier:
la source