Linux shell trier le fichier selon la deuxième colonne?

88

J'ai un fichier comme celui-ci:

FirstName, FamilyName, Address, PhoneNumber

Comment puis-je le trier par FamilyName?

Rami Jarrar
la source
quel os et processeur de commande?
Preet Sangha
1
Copie

Réponses:

152

S'il s'agit d'UNIX:

sort -k 2 file.txt

Vous pouvez utiliser plusieurs -kindicateurs pour trier sur plus d'une colonne. Par exemple, pour trier par nom de famille puis par prénom en tant que bris d'égalité:

sort -k 2,2 -k 1,1 file.txt

Options pertinentes de "man sort":

-k, --key = POS1 [, POS2]

démarrer une clé à POS1, la terminer à POS2 (origine 1)

POS est F [.C] [OPTS], où F est le numéro de champ et C la position du caractère dans le champ. OPTS est une ou plusieurs options de tri à une lettre, qui remplacent les options de tri globales pour cette clé. Si aucune clé n'est donnée, utilisez la ligne entière comme clé.

-t, --field-separator = SEP

utiliser SEP au lieu de la transition non vide à vide

John Kugelman
la source
2
Soyez juste un peu prudent à utiliser --field-separator=','si vous pouvez avoir un opérateur de saisie de données pour saisir des valeurs pour "Prénom" comme "Billy Bob" ou autre ... les espaces peuvent facilement entrer dans vos données si vous ne vous en protégez pas, mais les virgules sont relativement peu probables.
Tony Delroy
1
Il y a très probablement des cas de virgules dans ces champs, comme "Smith, Jr." ou "McDowell, Sr." ou "Dr. John" ou "New York, NY"
jbnunn
2
Notez que si les colonnes sont visuellement alignées, c'est-à-dire qu'il y a un nombre non constant d'espaces entre chaque champ, vous devez utiliser l' -boption. En effet, sorton considère en fait que la chaîne à trier commence juste après la virgule et non à partir de la première lettre de la colonne. De plus, vous devrez peut-être préfixer la commande avec LC_ALL=C, pour éviter tout effet secondaire dû aux paramètres régionaux, qui peut se produire même sur un simple fichier ASCII.
calandoa
@calandoa Merci pour la partie sur -b( --ignore-leading-blanks). Pour clarifier un peu: echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2donne la a<SPACE><SPACE>bpremière (la deuxième colonne commence après la première non-blank to blank transition, et <SPACE><SPACE>best avant <SPACE>a), mais avec -belle donne aa<SPACE>acomme prévu ( aest avant b).
Kirill Bulygin
7

Pour trier uniquement par deuxième champ (donc là où les deuxièmes champs correspondent, les lignes avec des correspondances restent dans l'ordre dans lequel elles sont dans l'original sans trier sur les autres champs):

sort -k 2,2 -s orig_file > sorted_file
Cian
la source
3

FWIW, voici une méthode de tri pour montrer quels processus utilisent le plus de mémoire virtuelle.

memstat | sort -k 1 -t':' -g -r | less

Les options de tri sont définies sur la première colonne, en utilisant: comme séparateur de colonne, le tri numérique et le tri inversé.

netskink
la source
2
sort -nk2 file.txt

En conséquence, vous pouvez modifier le numéro de colonne.

Dheeraj Kumar
la source