visualiseur de fenêtre de terminal pour les fichiers délimités par des tabulations dans * nix?

5

Je travaille avec beaucoup de fichiers de données délimités par des tabulations, avec des colonnes variables de longueur incertaine.

Généralement, les utilisateurs voient ces fichiers de manière à les faire descendre du serveur à leur ordinateur Windows ou Mac, puis à les ouvrir dans Excel. Ceci est certainement complet, permettant le filtrage et d'autres options intéressantes. Mais parfois, vous voulez juste regarder quelque chose rapidement sur la ligne de commande.

J'ai écrit un utilitaire simple pour afficher les premières <n>lignes d'un fichier comme ceci:

--- ligne 1 ---
1: {en-tête-1} 2: {en-tête-2} 3: ...

--- ligne 2 ---
1: {data-1} 2: {data-2} 3: ...

C’est évidemment très boiteux, mais c’est suffisant pour passer par grep ou pour déterminer les colonnes d’en-tête sur lesquelles utiliser "cut -f".

Existe-t-il une visionneuse basée sur * nix pour une session de terminal qui affiche les lignes et les colonnes d'un fichier délimité par des tabulations et vous permet de déplacer la fenêtre de visualisation sur le fichier ou de consulter les données?

Je ne veux pas écrire cela moi-même; au lieu de cela, je ferais juste un reformattre qui remplacerait les tabulations par des espaces pour le remplissage afin que je puisse ouvrir le fichier dans emacs et voir les colonnes alignées. Mais s'il existe déjà un outil pour faire quelque chose comme ça, ce serait génial!

(Ou, je pourrais juste vivre avec Excel.)

Michael H.
la source

Réponses:

7

Il existe une feuille de calcul Unix en mode texte appelée scqui peut fonctionner pour votre usage. Vous devrez probablement passer le fichier pscpour le convertir au format de fichier scutilisé.

Dennis Williamson
la source
Cela semble très prometteur! Cela semble m'avoir conduit dans la pagaille en cherchant où obtenir un sc , et pourquoi mon installation Fedora ne voit pas toutes les mises à jour de paquets, mais ce n'est le problème de personne d'autre. Merci!
Michael H.
Cela fonctionne très bien, merci! Surtout pour la suggestion psc. Maintenant, j'aimerais juste savoir comment passer onglet en tant que caractère séparateur unique à psc ...
weronika
@weronika: Si -d '\t'cela ne fonctionne pas, essayez-d $'\t'
Dennis Williamson
@ Dennis: Oui, j'ai finalement compris cela. :) Excellente solution, je l'utilise tout le temps maintenant.
Weronika
pscn'aime pas les colonnes de plus de 1021 caractères. C'est un problème pour moi. Je voudrais quelque chose de vraiment robuste pour visualiser (pas éditer) des fichiers délimités comme celui-ci. J'ai fait mes propres scripts, mais ils ne sont pas idéaux.
Aaron McDaid
12

Ceci fonctionne pour produire une jolie version imprimée d'un fichier délimité par des tabulations

column -t -s $'\t' list-of-entries.txt
toobsco42
la source
Merci, cela a bien fonctionné pour moi, après avoir diffusé les résultats dans less -S: column -t -s $'\t' someFile.tsv | less -S
bug313
Une mise en garde cependant ... Si le fichier contient des cellules vides, celles-ci seront perdues, car (à partir de la page de manuel :) "Par défaut, la commande de colonne fusionnera plusieurs délimiteurs adjacents dans un seul délimiteur lors de l'utilisation de l'option -t; Cette option est une extension de Debian GNU / Linux. " 'cette option' étant -n, la commande devrait donc être:column -nts$'\t' someFile.tsv | less -S
bug313
Enfin, comme ce paramètre -n n’est pas disponible sur macosx, vous pouvez par exemple insérer un espace pour les cellules vides, en utilisant perl -pe 's/((?<=\t)|(?<=^))\t/ \t/g;' someFile.tsv | column -t -s$'\t' | less -S le lookbehind
bug313
8

Ouvrez le fichier dans vim et définissez Tab Stop sur une valeur élevée pour que les colonnes soient alignées. Si vous n'êtes pas familier avec vim, commencez par le démarrer:

vim some_file.csv

Ensuite, définissez Tab Stop sur une valeur élevée afin que les colonnes soient alignées. Type:

:set tabstop=20

Si les lignes deviennent trop longues, vous devez également désactiver le retour à la ligne pour pouvoir faire défiler l'écran au lieu de placer le texte:

:set nowrap

Se déplacer: il y a plusieurs façons, mais les plus simples, comme les touches fléchées et pgup / pgdown / home / end, fonctionnent. Quelques autres commandes de mouvement utiles:

CTRL+U: move half screen up
CTRL+D: move half screen down
gg: move to top
G: move to bottom

Vous pouvez rechercher du texte comme vous le feriez chez l'homme:

/regular_expression (search forward)
?regular_expression (search backward)

Ensuite, tapez "n" pour trouver la correspondance suivante et "N" pour rechercher la précédente.

Vous pouvez également naviguer à l'aide de la souris si votre terminal le prend en charge et que vous tapez:

:set mouse=a

Edit: J'ai oublié que vous pouvez sortir avec:

:q (if you haven't changed the text)
:wq (to save it before quitting)
:q! (to abandon changes)
Petersohn
la source
Cela a très bien fonctionné - jusqu'à ce que je parvienne à la colonne qui contenait entre 40 et 200 caractères. L'espacement après cela était confus, comme vous pouvez l'imaginer. Mais tab-settings + nowrap s'est approché! Je vais devoir m'en souvenir.
Michael H.
Oh génial !! Si simple. Je ne peux pas croire que je n’aie jamais pensé à faire cela lorsque je luttais avec ces fichiers séparés par des tabulations dans vi.
Weronika
6

Il existe une autre solution, qui implique un script. Enregistrez ce script sur, par exemple tab.pl,.

#!/usr/bin/perl

use strict;

my @lines;
# first read the file into a list of lists
while (<>)
{
    chomp; # remove the newline from the end of the line
    my @fields = split("\t");
    push @lines, \@fields;
}
my @lengths;
# calculate the maximum lengths of each field
foreach (@lines)
{
    for (my $i = 0; $i < scalar @$_; $i++)
    {
        $lengths[$i] = $lengths[$i] < length $$_[$i] ? length $$_[$i] : $lengths[$i];
    }
}
# now print the text aligned
foreach (@lines)
{
    for (my $i = 0; $i < scalar @$_; $i++)
    {
        print $$_[$i], " " x ($lengths[$i] - length ($$_[$i]) + 1);
    }
    print "\n";
}

Puis tapez simplement:

perl tab.pl some_file.csv | less

Ou sauvegardez le résultat dans un fichier et ouvrez-le avec votre éditeur de texte préféré:

perl tab.pl some_file.csv > result.txt
Petersohn
la source
C'est ce à quoi je pensais lorsque j'ai dit que je pouvais faire un reformattre pour remplacer les onglets par des espaces et un pad. Je vais librement admettre que votre version est beaucoup plus compacte que la mienne! Je vous remercie!
Michael H.
Très bien merci! Je l'ai attrapé, ça marche plutôt bien, mais je vais devoir le modifier un peu pour tenir compte du fait que mes fichiers ont tendance à contenir des en-têtes / pieds de page non séparés par des tabulations qui doivent être traités séparément.
Weronika
1

prvous permet d'étendre les onglets à un nombre donné d'espaces avec -e. Ne pas oublier de passer de -t -Tsorte qu'il n'a pas réellement formater la page entière pour l' impression.

Ignacio Vazquez-Abrams
la source