150 votes

Existe-t-il un moyen d'ignorer les lignes d'en-tête dans un tri UNIX ?

J'ai un fichier à champs de largeur fixe que j'essaie de trier à l'aide de l'utilitaire de tri UNIX (Cygwin, dans mon cas).

Le problème est qu'il y a un en-tête de deux lignes en haut du fichier qui est trié en bas du fichier (car chaque ligne d'en-tête commence par un deux-points).

Existe-t-il un moyen de dire à sort de "laisser passer les deux premières lignes sans les trier" ou de spécifier un ordre qui trie les deux lignes en haut - les lignes restantes commencent toujours par un chiffre à 6 chiffres (qui est en fait la clé sur laquelle je trie) si cela peut aider.

Exemple :

:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00

devrait être triée :

:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00

162voto

BobS Points 804
(head -n 2 <file> && tail -n +3 <file> | sort) > newfile

Les parenthèses créent un sous-shell, enveloppant le stdout afin que vous puissiez le canaliser ou le rediriger comme s'il provenait d'une seule commande.

114voto

Dave Points 484

Si cela ne vous dérange pas d'utiliser awk vous pouvez profiter des avantages suivants awk Les capacités de tuyauterie intégrées de la société

eg.

extract_data | awk 'NR<3{print $0;next}{print $0| "sort -r"}' 

Cela imprime les deux premières lignes mot pour mot et passe le reste dans le tube sort .

Notez que ceci a l'avantage très spécifique de pouvoir trier sélectivement des parties Toutes les autres méthodes proposées ne trient que les fichiers simples qui peuvent être lus plusieurs fois. Ceci fonctionne sur n'importe quoi.

85voto

Andrea Points 551

Dans les cas simples, sed peut faire le travail de manière élégante :

    your_script | (sed -u 1q; sort)

ou de manière équivalente,

    cat your_data | (sed -u 1q; sort)

La clé est dans le 1q -- imprime la première ligne (en-tête) et quitte (en laissant le reste de l'entrée à sort ).

Pour l'exemple donné, 2q fera l'affaire.

El -u (non tamponné) est nécessaire pour ceux sed (notamment ceux de GNU) qui, autrement, liraient l'entrée par morceaux, consommant ainsi des données que vous voulez faire passer par le biais de sort à la place.

49voto

freeseek Points 1486

Voici une version qui fonctionne sur les données en pipeline :

(read -r; printf "%s\n" "$REPLY"; sort)

Si votre en-tête comporte plusieurs lignes :

(for i in $(seq $HEADER_ROWS); do read -r; printf "%s\n" "$REPLY"; done; sort)

Cette solution provient de aquí

7voto

Anton Kovalenko Points 12838

Vous pouvez utiliser tail -n +3 <file> | sort ... (tail va sortir le contenu du fichier à partir de la 3ème ligne).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X