J'ai un fichier à champ 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 que le tri "passe les deux premières lignes non triées" ou de spécifier un ordre qui trie les lignes deux-points vers le haut - les lignes restantes commencent toujours par un numérique à 6 chiffres (qui est en fait la clé I 'm tri sur) si cela aide.
Exemple:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00
devrait trier:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00
unix
sorting
command-line
Rob Gilliam
la source
la source
Réponses:
Les parenthèses créent un sous-shell, encapsulant le stdout afin que vous puissiez le diriger ou le rediriger comme s'il provenait d'une seule commande.
la source
tee >(head -n $header_size) | tail -n +$header_size | sort
, mais la tête semble courir après letail|sort
tuyau, donc l'en-tête finit par être imprimé à la fin. Est-ce une condition déterministe ou raciale?cat
pour rediriger le stdin vers un fichier temporaire, puis exécuter la commande ci-dessus sur ce nouveau fichier, mais cela commence à devenir assez moche pour qu'il soit probablement préférable d'utiliser l'une des solutions basées sur awk données dans les autres réponses.Si cela ne vous dérange pas d'utiliser
awk
, vous pouvez profiter desawk
capacités de tuyau intégréespar exemple.
Cela imprime les deux premières lignes textuellement et conduit le reste à travers
sort
.Notez que cela présente l'avantage très spécifique de pouvoir trier sélectivement des parties d'une entrée canalisée. toutes les autres méthodes suggérées ne trieront que les fichiers simples qui peuvent être lus plusieurs fois. Cela fonctionne sur n'importe quoi.
la source
$0
,print
c'est assez.Voici une version qui fonctionne sur les données canalisées:
Si votre en-tête comporte plusieurs lignes:
Cette solution est d' ici
la source
extract_data | (read h; echo "$h"; sort)
il est assez court pour se souvenir. votre exemple couvre plus de cas marginaux. :) C'est la meilleure réponse. fonctionne sur les tuyaux. pas de problème.extract_data | (read; sort)
Dans les cas simples,
sed
peut faire le travail avec élégance:ou équivalent,
La clé est dans la
1q
- imprimer la première ligne (en-tête) et quitter (en laissant le reste de l'entrée àsort
).Pour l'exemple donné,
2q
fera l'affaire.Le
-u
commutateur (sans tampon) est requis pour lessed
s (notamment les GNU) qui liraient autrement l'entrée en morceaux, consommant ainsi les données que vous souhaitez parcourir à lasort
place.la source
Vous pouvez utiliser
tail -n +3 <file> | sort ...
(tail affichera le contenu du fichier à partir de la 3ème ligne).la source
exemple:
la source
Cela ne prend que 2 lignes de code ...
Pour une donnée numérique, -n est obligatoire. Pour le tri alpha, l'option -n n'est pas obligatoire.
Exemple de fichier:
$ cat test.txt
Résultat:
$ cat a.tmp
la source
Voici donc une fonction bash où les arguments sont exactement comme le tri. Fichiers et tuyaux de soutien.
Comment ça fonctionne. Cette ligne vérifie s'il y a au moins un argument et si le dernier argument est un fichier.
Cela enregistre le fichier pour séparer l'argument. Puisque nous sommes sur le point d'effacer le dernier argument.
Ici, nous supprimons le dernier argument. Puisque nous ne voulons pas le passer comme argument de tri.
Enfin, nous faisons la partie awk, en passant les arguments (moins le dernier argument s'il s'agissait du fichier) pour trier dans awk. Cela a été suggéré à l'origine par Dave et modifié pour prendre des arguments de tri. Nous comptons sur le fait que ce
$file
sera vide si nous sommes à la tuyauterie, donc ignoré.Exemple d'utilisation avec un fichier séparé par des virgules.
la source
Avec Python:
la source
Voici une fonction shell bash dérivée des autres réponses. Il gère à la fois les fichiers et les tuyaux. Le premier argument est le nom du fichier ou «-» pour stdin. Les arguments restants sont passés au tri. Quelques exemples:
La fonction shell:
la source
C'est la même chose que la réponse d'Ian Sherbin mais ma mise en œuvre est: -
la source
Cela fera ce que vous voulez.
la source