Tri du fichier par première puis deuxième colonne


13

Comment puis-je manipuler un fichier texte séparé par des tabulations en deux colonnes en triant par le premier élément de la deuxième colonne (uniquement si le premier élément de la colonne est le même)?

Exemple:

Fichier d'entrée 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9

Sortie attendue: Fichier 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

Réponses:


22

Utilisez sortl' -koption de pour trier par (plusieurs) colonnes à la fois:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

-k1,1trie d'abord par la première colonne, puis -k2npar la seconde¹ numériquement lorsque la première colonne était liée, vous obtenez donc votre sortie dans l'ordre que vous souhaitez: tri par le premier élément de la deuxième colonne, uniquement si le premier élément de la colonne est le même.

Lors du tri numérique, il examine uniquement le champ jusqu'à ce qu'il cesse d'être un nombre, ce qui vous donne une comparaison du premier élément seulement.

Lorsque les deux clés se comparent de la même manière, sortcompare ensuite les lignes complètes lexicalement en tant que comparaison de dernier recours. Par exemple, dans A 1-10vs A 1-2, les premières clés sont identiques ( Achaîne), et la deuxième clé également (les deux sont traitées comme le nombre 1), donc sortcompare A 1-10vs A 1-2lexicalement et ce dernier est plus grand comme 2tri après 1. L'implémentation GNU de sorta une -Voption ou Vun indicateur clé pour effectuer un tri de version , ce qui est comme une comparaison lexicale, sauf que les séquences de chiffres décimaux dans les chaînes sont comparées numériquement, donc sort -k1,1 -k2Vtriées A 1-10après A 1-2car 10un nombre est supérieur à 2.


¹ techniquement, -k2signifie la partie de la ligne commençant par le deuxième champ (après la première transition d'un non-blanc à un blanc) et se terminant à la fin de la ligne, mais avec le ndrapeau, cela équivaut à -k2,2nla seule partie principale qui constitue un nombre est considéré.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.