Je reçois des résultats d'un programme qui produit d'abord une ligne composée d'en-têtes de colonnes, puis de lignes de données. Je souhaite couper différentes colonnes de cette sortie et les afficher triées en fonction de différentes colonnes. Sans les en- têtes, la découpe et le tri est facilement accompli par la -k
possibilité d' sort
en même temps que cut
ou awk
pour afficher un sous - ensemble des colonnes. Cependant, cette méthode de tri mélange les en-têtes de colonne avec le reste des lignes de sortie. Existe-t-il un moyen simple de garder les en-têtes en haut?
text-processing
sort
table
Jonderry
la source
la source
{ head -1; sort; }
travail. Il supprime toujours une partie du texte après la première ligne. Est-ce que quelqu'un sait pourquoi cela se produit?head
lit plus d’une ligne dans un tampon et qu’il en jette la majeure partie. Monsed
idée avait le même problème.lseek
entrée capable, elle ne fonctionnera donc pas lors de la lecture d'un tuyau. Cela fonctionnera si vous redirigez vers un fichier>outfile
puis exécutez{ head -n 1; sort; } <outfile
Réponses:
Voler l'idée d'Andy et en faire une fonction pour en faciliter l'utilisation:
Maintenant je peux faire:
la source
ps -C COMMAND
peut-être plus approprié quegrep COMMAND
, mais ce n'est qu'un exemple. En outre, vous ne pouvez pas utiliser-C
si vous avez également utilisé une autre option de sélection telle que-U
.body
? Comme dansbody sort
oubody grep
. Pensées?header
àbody
, parce que vous faites l'action sur le corps. Espérons que cela a plus de sens.body
tous les participants suivants au pipeline:ps -o pid,comm | body grep less | body sort -k1nr
<foo body sort -k2
oubody sort -k2 <foo
. Juste un caractère supplémentaire de ce que tu voulais.Vous pouvez garder l'en-tête en haut comme ceci avec bash:
Ou le faire avec perl:
la source
{}
ok au lieu de()
?IFS=
désactive le fractionnement des mots lors de la lecture de l'entrée. Je ne pense pas que ce soit nécessaire pour lire$REPLY
.echo
développera les échappements de barre oblique inversée sixpg_echo
est défini (pas la valeur par défaut);printf
est plus sûr dans ce cas.echo $REPLY
sans guillemets va condenser les espaces; Je penseecho "$REPLY"
que ça devrait aller.read -r
est nécessaire si l'entrée peut contenir des échappements de barre oblique inversée. Une partie de ceci pourrait dépendre de la version de bash.read REPLY; echo $REPLY
( supprime les espaces de début ) etread; echo $REPLY
(non).xpg_echo
dépend de votre système. Par exemple, sous Solaris , la valeur par défaut est true. C'est pourquoi Gilles aimeprintf
tellement: c'est la seule chose avec un comportement prévisible.J'ai trouvé une belle version de awk qui fonctionne bien dans les scripts:
la source
sort
commande à l'extérieur? Est-ce que quelqu'un connaît au moins un lien vers une page expliquant l'utilisation de la pipe dans awk?Hackish mais efficace: ajoutez avant
0
toutes les lignes d'en-tête et1
toutes les autres lignes avant le tri. Dénudez le premier caractère après le tri.la source
Voici un bruit de ligne perl magique que vous pouvez diriger vers votre sortie pour tout trier, mais gardez la première ligne en haut:
perl -e 'print scalar <>, sort <>;'
la source
J'ai essayé la
command | {head -1; sort; }
solution et je peux confirmer que les choses vont vraiment mal -head
lit plusieurs lignes à partir du tuyau, puis ne produit que la première. Ainsi, le reste de la sortie, quihead
n'a pas été lu, est passé àsort
--NOT le reste de la sortie à partir de la ligne 2!Le résultat est qu'il vous manque des lignes (et une ligne partielle!) Qui figuraient au début de la sortie de votre commande (sauf que vous avez toujours la première ligne) - un fait facile à confirmer en ajoutant un tuyau
wc
à la fin de le pipeline ci-dessus - mais il est extrêmement difficile de retracer si vous ne le savez pas! J'ai passé au moins 20 minutes à essayer de comprendre pourquoi j'avais une ligne partielle (100 premiers octets ou plus coupés) dans ma sortie avant de la résoudre.Ce que j'ai fini par faire, ce qui a fonctionné à merveille et n'a pas nécessité l'exécution de la commande deux fois, a été:
Si vous devez mettre la sortie dans un fichier, vous pouvez le modifier pour:
la source
head
ksh93 ou l'line
utilitaire (sur les systèmes qui en ont toujours un) ougnu-sed -u q
ouIFS=read -r line; printf '%s\n' "$line"
, qui lit l'entrée un octet à la fois pour éviter cela.Je pense que c'est le plus facile.
ou ce qui est peut-être plus rapide car il ne crée pas de shell secondaire
Autres utilisations intéressantes
mélanger les lignes après la ligne d'en-tête
lignes inverses après la ligne d'en-tête
la source
cat file | { head -n 1 ; sort ; } > file2
seulement montrer la têtela source
command
deux fois. Par conséquent, il est limité à certaines commandes spécifiques. Cependant, pour laps
commande demandée dans l'exemple, cela fonctionnerait.Simple et direct!
la source
command
deux fois. Donc, pas vraiment approprié pour une utilisation dans un pipeline.Je suis venu ici à la recherche d'une solution pour la commande
w
. Cette commande affiche les détails de qui est connecté et de ce qu’ils font.Pour afficher les résultats triés, mais avec les en-têtes conservés en haut (il y a 2 lignes d'en-têtes), je me suis installé sur:
Évidemment, cela lance la commande
w
deux fois et peut donc ne pas convenir à toutes les situations. Cependant, à son avantage, il est nettement plus facile à retenir.Notez que le
tail -n +3
moyen "affiche toutes les lignes à partir de la 3ème" (voir lesman tail
détails).la source
Essayez de faire:
la source