Unix est-il ssortingctement lexical?

Je dois traiter de nombreux fichiers délimités à deux colonnes (’00s) sortingés numériquement par leur première colonne (un entier long pouvant aller de 857 à 293823421 par exemple).

Le traitement est assez simple: parcourir une boucle pour joindre les fichiers à l’aide de l’un d’eux comme «ancre» (le fichier «gauche» dans la jointure), en utilisant les options join -s et -o pour remplir les .

Question: Y a-t-il un moyen de join (de Core Utils 8.13) ou dois-je append une étape sort -k1,1 pour assurer l’ordre lexical avant chaque jointure?

Tout ce que j’ai lu en train de chercher cela me dit que je dois le faire, mais je voulais m’assurer que je ne manquais pas un truc intelligent pour éviter le sorting supplémentaire. Je vous remercie.

En effet, la join ne supporte pas les comparaisons numériques. Cependant, d’après votre description, il semble que vous puissiez convertir votre premier champ en une forme déjà sortingée en chaîne en la remplissant par zéro, puis la reconvertir en la remplissant par zéro. Par exemple, voici une fonction qui effectue une join -e NULL sur deux fichiers correspondant à votre description (si je comprends bien):

 function join_by_numeric_first_field () { local file1="$1" local file2="$2" join -e NULL <(awk '{printf("%020d\t%s\n", $1, $2)}' "$file1") \ <(awk '{printf("%020d\t%s\n", $1, $2)}' "$file2") \ | awk '{printf("%d\t%s\n", $1, $2)}' } 

(Le awk '{printf("%020d\t%s\n", $1, $2)}' lit chaque ligne d'une entrée à deux colonnes et réimprime les deux colonnes, séparées par un onglet, mais en traitant le La première colonne est un entier décimal et remplie par zéro jusqu'à vingt caractères. Le awk '{printf("%d\t%s\n", $1, $2)}' fait la même chose, sauf que tamponner le nombre entier décimal, il a pour effet de supprimer tout remplissage nul qui existait.)

Que ce soit une meilleure approche que le sort dépendra de la taille de vos fichiers et de la flexibilité dont vous avez besoin pour prendre en charge des fichiers qui ne correspondent pas tout à fait à votre description. Cette approche évolue linéairement avec la taille du fichier, mais elle est nettement plus compliquée et est également un peu plus fragile, dans la mesure où les commandes awk attendent un format d'entrée assez spécifique. L'approche de sort est beaucoup plus simple, mais ne fonctionnera pas aussi bien pour les gros fichiers.