J'ai des fichiers texte sur plusieurs lignes de données (parfois) délimitées par des tabulations. Je voudrais sortir le fichier afin que je puisse y jeter un coup d'œil - donc je voudrais seulement voir les 80 premiers caractères de chaque ligne (j'ai conçu le fichier texte pour mettre les choses importantes en premier sur chaque ligne).
J'avais pensé que je pouvais utiliser cat pour lire chaque ligne du fichier et envoyer chaque ligne à la commande suivante dans un pipe:
cat tabfile | cut -c -80
Mais cela semblait cassé. J'ai essayé de faire des singes, et grep semble fonctionner - mais j'ai découvert que non, ce n'était pas le cas (toutes les lignes du fichier ne comptaient pas plus de 80 caractères) - il semble que les onglets soient comptés comme des caractères uniques par coupe.
J'ai essayé:
cat tabfile | tr \t \040 | cut -c -80
Même si cela altérerait un peu mes données, en éliminant la lisibilité des espaces blancs. Mais cela n'a pas fonctionné. Pas plus:
cat tabfile | tr \011 \040 | cut -c -80
Peut-être que j'utilise tr mal? J'ai eu des problèmes avec tr auparavant, je voulais supprimer plusieurs espaces (la version de tr à laquelle j'ai accès sur cette machine semble avoir une option -s pour presser plusieurs caractères - je devrais peut-être jouer avec)
Je suis sûr que si je déconnais, je pourrais utiliser perl, awk ou sed, ou quelque chose pour le faire.
Cependant, j'aimerais une solution qui utilise des commandes régulières (POSIX?), Afin qu'elle soit aussi portable que possible. Si je finis par utiliser tr, j'essaierais probablement de transformer les onglets en caractères, peut-être de faire un calcul, de couper le calcul, puis de reconvertir ces caractères en onglets pour la sortie.
Il n'a pas besoin d'être une seule ligne / entré directement sur la ligne de commande - un script est très bien.
Plus d'informations sur les fichiers à onglets:
J'utilise tab pour casser les champs, car un jour je souhaiterai peut-être importer des données dans un autre programme. J'ai donc tendance à n'avoir qu'un seul onglet entre les éléments de contenu. Mais j'utilise également des onglets pour aligner les choses avec les colonnes verticales, pour aider à la lisibilité lorsque vous regardez le fichier texte brut. Ce qui signifie que pour certains morceaux de texte, je garnis la fin du contenu avec des espaces jusqu'à ce que l'onglet fonctionne en alignant le champ suivant avec ceux au-dessus et en dessous.
DarkTurquoise # 00CED1 Mers, cieux, chaloupes Nature MediumSpringGreen # 00FA9A Utile pour les arbres Magic Lime # 00FF00 Uniquement pour les poulets de printemps et fru $
pr
decoreutils
:pr -1 -t -l200 -W80 file
. Augmentez / diminuez la longueur de la page (nombre après-l
) selon vos besoins.Réponses:
Je pense que vous cherchez
expand
et / ouunexpand
. Il semble que vous essayez de vous assurer qu'une\t
largeur ab compte pour 8 caractères plutôt que pour l'unique.fold
le fera également, mais il encapsulera son entrée sur la ligne suivante plutôt que de la tronquer. Je pense que tu veux:expand
etunexpand
sont tous deux spécifiés POSIX :expand
utilitaire doit écrire des fichiers ou l'entrée standard dans la sortie standard avec des\t
caractères ab remplacés par un ou plusieurs caractères d' espace nécessaires pour passer à la tabulation suivante. Tout caractère de retour arrière doit être copié dans la sortie et entraîner la décrémentation du décompte de position de colonne pour les calculs de tabulation; le décompte de position de colonne ne doit pas être décrémenté en dessous de zéro.Assez simple. Alors, voici un aperçu de ce que cela fait:
La
until
boucle en haut obtient un ensemble de données comme ...Il s'agit
printf
de l'%*s
indicateur de remplissage d'argument, donc pour chacun de ceux de l'ensemble, il yprintf
aura autant d'espaces que le nombre d'arguments. À chacun, il ajoute un\t
caractère ab.Tous les
tee
s sont utilisés pour montrer les effets de chaque filtre lors de son application.Et les effets sont les suivants:
Ces rangées sont alignées en deux ensembles comme ...
printf ...; echo
tr ...
ouexpand
cut
wc
Les quatre premières rangées sont les résultats du
tr
filtre - dans lequel chaque\t
ab est converti en un seul espace .Et les quatre derniers résultats de la
expand
chaîne.la source
Étant donné que les onglets sont plus destinés à l'alignement qu'à la délimitation, une façon pourrait être d'utiliser
column
puiscut
:Il semble que ce
column
ne soit pas POSIX. Il fait partie des utilitaires BSD sur Ubuntu, donc je suppose que c'est assez multiplateforme.la source
column
cette façon, OP n'aurait même pas besoin d'ajouter manuellement des espaces pour s'aligner.La suggestion de Don dans les commentaires était un bon début.
Voici ce dont j'avais besoin pour que cela fonctionne (principalement):
Le
-m
était nécessaire pour que le-w
drapeau prenne effet sur une seule colonne. La page de manuel pourrait utiliser une réécriture pour indiquer cela.En essayant une solution de contournement, j'ai trouvé que les caractères
pr
sortaient\t
, donc nourrir ses résultatscut
entraînait le même problème.-1
(l'indicateur de colonne) dit spécifiquement dans la page de manuel:Cependant, sans cette option, les
pr
lignes sont tronquées à volonté, à une longueur beaucoup plus courte que la longueur spécifiée.pr
insère également un espace avant (ou après?) chaque mot dans un champ (c'est-à-dire que chaque endroit où j'ai un seul espace, en a deux après le traitement). S'il y a trop de mots, les espaces insérés ignorent la-w
restriction (création d'un bouclage). Mais, curieusement, les «colonnes» autrement non délimitées par des tabulations (c'est-à-dire disposées en espaces blancs) restent alignées.la source
En utilisant
awk
:Basé sur la réponse de Chris Down ici .
la source
Un utilitaire qui devrait être vraiment conscient de la largeur d'affichage est
fold
: malheureusement, il ne semble pas avoir une option à ignorer au lieu d'envelopper. Bien qu'il soit probablement horriblement inefficace, vous pouvez cependant faire quelque chose commela source