Disons que vous avez un fichier txt, quelle est la commande pour afficher les 10 premières lignes et les 10 dernières lignes du fichier simultanément?
c'est-à-dire que si le fichier fait 200 lignes, visualisez les lignes 1-10 et 190-200 en une seule fois.
Réponses:
Vous pouvez simplement:
Et si vous avez besoin d'utiliser des tuyaux pour une raison quelconque, alors comme ceci:
Remarque: imprimera des lignes dupliquées si le nombre de lignes dans file.txt est inférieur aux lignes de tête par défaut + lignes de queue par défaut.
la source
head
a consommé les 10 premières lignes du fichier. (Comparez cela avechead < file.txt; tail < file.txt
un fichier de moins de 20 lignes). Juste un point très mineur à garder à l'esprit. (Mais toujours +1.)head
que les 10 premières lignes de son entrée, il n'est pas garanti qu'il n'en ait pas consommé plus pour trouver la fin de la 10ème ligne, laissant moins d'entrée pour l' affichage.less
seq 100 | (head; tail)
me donne seulement 10 premiers chiffres. Ce n'est que sur une taille d'entrée beaucoup plus grande (commeseq 2000
) que la queue reçoit une entrée.ed
est lestandard text editor
la source
sed
poured
Pour un flux pur (par exemple, la sortie d'une commande), vous pouvez utiliser 'tee' pour bifurquer le flux et envoyer un flux à la tête et un à la queue. Cela nécessite l'utilisation de la fonction '> (list)' de bash (+ / dev / fd / N):
ou en utilisant / dev / fd / N (ou / dev / stderr) plus des sous-shell avec une redirection compliquée:
(Aucun de ceux-ci ne fonctionnera dans csh ou tcsh.)
Pour quelque chose avec un peu meilleur contrôle, vous pouvez utiliser cette commande perl:
la source
COMMAND | { tee >(head >&2) | tail; } |& other_commands
cat >/dev/null
le corrige:COMMAND | { tee >(head >&2; cat >/dev/null) | tail; } |& other_commands
head
ettail
commandes: \ ...Juste une autre variation sur le
(head;tail)
thème, mais en évitant le problème de remplissage initial du tampon pour les petits fichiers.la source
head -10 file.txt; tail -10 file.txt
En dehors de cela, vous devrez écrire votre propre programme / script.
la source
cat
et /head
outail
sifflés, bon à savoir que je peux les utiliser individuellement!{ head file; tail file; } | prog
(l'espacement à l'intérieur des accolades et le point-virgule de fin sont requis)Basé sur le commentaire de JF Sebastian :
De cette façon, vous pouvez traiter la première ligne et le reste différemment dans un même tube, ce qui est utile pour travailler avec des données CSV:
la source
le problème ici est que les programmes orientés flux ne connaissent pas à l'avance la longueur du fichier (car il se peut qu'il n'y en ait pas, s'il s'agit d'un vrai flux).
des outils comme
tail
tamponner les n dernières lignes vues et attendre la fin du flux, puis imprimer.si vous voulez le faire en une seule commande (et le faire fonctionner avec n'importe quel décalage, et ne pas répéter les lignes si elles se chevauchent), vous devrez émuler ce comportement que j'ai mentionné.
essayez ce awk:
la source
a.out | awk -v ...
Il a fallu beaucoup de temps pour aboutir à cette solution qui semble être la seule à couvrir tous les cas d'utilisation (jusqu'à présent):
Liste des fonctionnalités:
la source
Je cherchais cette solution depuis un moment. Je l'ai essayé moi-même avec sed, mais le problème de ne pas connaître au préalable la longueur du fichier / flux était insurmontable. De toutes les options disponibles ci-dessus, j'aime la solution awk de Camille Goudeseune. Il a noté que sa solution laissait des lignes vierges supplémentaires dans la sortie avec un ensemble de données suffisamment petit. Ici, je propose une modification de sa solution qui supprime les lignes supplémentaires.
la source
Eh bien, vous pouvez toujours les enchaîner. Comme tel,
head fiename_foo && tail filename_foo
. Si cela ne suffit pas, vous pouvez écrire vous-même une fonction bash dans votre fichier .profile ou dans tout fichier de connexion que vous utilisez:Et, appelez plus tard à partir de votre invite du shell:
head_and_tail filename_foo
.la source
10 premières lignes de file.ext, puis ses 10 dernières lignes:
cat file.ext | head -10 && cat file.ext | tail -10
10 dernières lignes du fichier, puis les 10 premières:
cat file.ext | tail -10 && cat file.ext | head -10
Vous pouvez également diriger la sortie ailleurs:
(cat file.ext | head -10 && cat file.ext | tail -10 ) | your_program
la source
tail
et /head
ou à une fonction en l'aliasant.J'ai écrit une application python simple pour ce faire: https://gist.github.com/garyvdm/9970522
Il gère les tubes (flux) ainsi que les fichiers.
la source
s'inspirant des idées ci-dessus (testé bash & zsh)
mais en utilisant un alias `` chapeau '' Head and Tails
la source
Pourquoi ne pas l'utiliser
sed
pour cette tâche?sed -n -e 1,+9p -e 190,+9p textfile.txt
la source
Pour gérer les tubes (flux) ainsi que les fichiers, ajoutez ceci à votre fichier .bashrc ou .profile:
Alors vous pouvez non seulement
mais aussi
(Cela ajoute toujours de fausses lignes vides lorsque 10 dépasse la longueur de l'entrée, contrairement à l'ancien
a.out | (head; tail)
. Merci, précédents répondants.)Remarque:
headtail 10
nonheadtail -10
.la source
S'appuyant sur ce que @Samus_ a expliqué ici sur le fonctionnement de la commande de @Aleksandra Zalcman, cette variante est pratique lorsque vous ne pouvez pas repérer rapidement où la queue commence sans compter les lignes.
Ou si vous commencez à travailler avec autre chose que 20 lignes, un nombre de lignes peut même vous aider.
la source
Pour imprimer les 10 premières et les 10 dernières lignes d'un fichier, vous pouvez essayer ceci:
cat <(head -n10 file.txt) <(tail -n10 file.txt) | less
la source
REMARQUE : la variable aFile contient le chemin d'accès complet du fichier .
la source
Je dirais qu'en fonction de la taille du fichier, la lecture active de son contenu peut ne pas être souhaitable. Dans ce cas, je pense qu'un simple script shell devrait suffire.
Voici comment j'ai récemment géré cela pour un certain nombre de très gros fichiers CSV que j'analysais:
Cela imprime les 10 premières lignes et les 10 dernières lignes de chaque fichier, tout en imprimant également le nom du fichier et quelques points de suspension avant et après.
Pour un seul gros fichier, vous pouvez simplement exécuter ce qui suit pour le même effet:
la source
Consomme stdin, mais simple et fonctionne pour 99% des cas d'utilisation
head_and_tail
exemple
la source