Comment ajouter un numéro de ligne et une tabulation à chaque ligne d'un fichier texte?

45

Comment puis-je ajouter un numéro de ligne et une tabulation au début de chaque ligne d'un fichier texte?

Richard Hoskins
la source
Ce que je me demande, c'est comment vous le feriez sous Windows ...
itsadok le
4
Cela devrait-il être sur stackoverflow? Pour le super-utilisateur, la réponse est le Bloc-notes et beaucoup de patience.
kokos
2
Alors, voulez-vous ajouter ou ajouter des éléments? Votre titre et le corps de votre texte sont différents;)
matpie
Je suppose que je veux ajouter au début , "préposer" n’est qu’un mot pour les pirates.
Richard Hoskins
Sous Windows, comme pour toute autre question liée à la programmation, vous pouvez installer Cygwin, puis utiliser les réponses ci-dessous.
Jonathan Hartley

Réponses:

49
awk '{printf "%d\t%s\n", NR, $0}' < filename
les pages
la source
10
Ou awk '{print NR, "\t", $0}'.
jtbandes
1
La réponse ci-dessous, avec la ligne de commande nl, est une solution beaucoup plus simple.
Daniel Ribeiro
2
@DanielRibeiro plus simple mais moins fiable et moins flexible.
Jonathan Hartley
@DanielRibeiro La réponse à l'aide nlest également FAUX. Dans le code source, il ne vous donnera jamais les bons numéros de ligne, car il ne compte pas les lignes contenant uniquement des espaces.
oligofren
@jtbandes Votre solution ajoute des espaces entre le numéro de ligne et la tabulation (au moins sur mon mac)
Yossi Vainshtein
55

La commande nl devrait le faire, mais elle ajoute également un espace avant le numéro de ligne. Cela fait partie de Linux coreutils.

nl lines.txt
 1  $bkWTN
 2  $cV8$.
ACoolie
la source
4
En fait, vous pouvez dire nld’omettre l’espace avant le nombre. Utilisez simplement cette -w1option pour lui indiquer que la largeur minimale d’un nombre est 1.
cjm
2
Attention, 'nl' suppose par défaut que votre texte est divisé en 'pages' avec en-têtes et pieds de page, tous délimités par des lignes telles que '\:' ou '\: \:' ou '\: \: \:'. Si votre texte contient des lignes telles que celle-ci, alors 'nl' produira des résultats inattendus, tels qu'avaler ces lignes, les sections sans numérotation ou redémarrer la numérotation à partir de 1 dans une section. Utilisez -dXY (où XY est une paire de caractères qui ne figurent pas seuls sur une ligne dans votre texte) pour éviter ce problème. Dans le cas général, cela peut être difficile à prévoir, je vous recommande donc d'utiliser l'une des solutions proposées sur cette page.
Jonathan Hartley
L'utilisation de «-w1» ne supprime pas simplement l'espace après les chiffres, mais tronque également les numéros de ligne pour ne comporter qu'un seul caractère, ce qui signifie que vos numéros de ligne affichent uniquement leur chiffre le moins significatif. Ce n'est certainement pas ce que vous voulez.
Jonathan Hartley
4
Avec, -nlnvous pouvez justifier à gauche si vous ne voulez pas d'espace avant les numéros de ligne. En outre, pour spécifier un séparateur de tabulation, vous pouvez utiliser -s$'\t'ou -s' '(insérer une tabulation entre guillemets simples avec ctrl+vthen tab).
don_crissti
2
@ JonathanHartley nl -w1(d'après GNU coreutils 8.24) ne tronque pas les numéros de ligne.
Skippy le Grand Gourou
10
sed = test.txt | sed 'N;s/\n/\t/'

La commande "sed =" affichera le numéro de ligne suivi d'un retour à la ligne puis de la ligne suivante.

L'expression "N; s / \ n / \ t /" prendra chaque ligne, obtiendra la ligne suivante (c'est-à-dire le numéro de ligne et la ligne) et remplacera le retour chariot par une tabulation.

Callum
la source
Imprime un "t" sans onglet avec ma version de sed: 8t j'ai vu les meilleurs esprits de ma génération être détruits par la folie 9t, affamés hystériques nus,
Richard Hoskins
1
Notez qu’il \ns’agit d’un saut de ligne (communément appelé simplement "nouvelle ligne", car sa première utilisation répandue a été sous Unix) et \rcorrespond à un retour chariot. Windows utilise \r\n(également appelé CRLF).
Camilo Martin
(Yay nitpicking!)
Camilo Martin
Si nous allons nous lancer dans des querelles quant à la possibilité que les fenêtres soient différentes, nous devrons peut-être envisager l'UTF16.
mc0e
4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n ajoute linumbers en tant que "123 linecontents" et que l'expression rationnelle le modifie en "linumberTABlinecontents"

Raspi
la source
3
perl -pe "s/^/$.\t$_/" file.txt

ou

perl -ne "print qq($.\t$_)" file.txt
Itsadok
la source
2

Que diriez-vous

cat -n somefile.txt

?

innaM
la source
1
Aucun onglet. (Les commentaires nécessitant 15 caractères sont une exigence stupide.)
Richard Hoskins le
1
Cela produit des onglets sur mon système. chat (GNU coreutils) 6.10.
InnaM
Sur mon système, il ajoute une ligne (onglet) numéro (espace). BSD Utils.
Richard Hoskins
2

OK, voici une solution bash sur une ligne:

$ IFS=$'\n';x=1;for l in $(<file.txt);do echo -e "$x\t$l";((x+=1));done
$ IFS=

Le premier paramètre IFS indique à bash de lire une ligne complète à la fois. La deuxième ligne réinitialise l'IFS par défaut.

En prime, il fonctionne complètement dans votre shell et n'exécute pas de programme!

P. Heffner
la source
1

Ok, puisque nous recueillons des moyens de le faire,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 
nik
la source
Maintenant je vois ça. OK, supprimez mon propre message. Quelle? Vous dites que le SU ne vous laisse pas supprimer votre propre message?
Kevin M
grep + sed == awk
Tadeusz A. Kadłubowski
1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

ou pour certains non-GNU sed:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'
le chaos
la source
Imprime un "t" sans onglet avec ma version de sed.
Richard Hoskins
Édité à double échappement; essayez comme ça.
chaos
Si tout échoue, appuyez simplement sur l'onglet. :) (Ou ^ V onglet si votre shell vous donne des problèmes avec ça.)
chaos
sed: 1: "test.txt": label non défini 'est.txt'
Richard Hoskins le
'chat test.txt | sed -e 's / ^ / \\ t /' | empreintes de chat (tab) nombre (espace) \ t (ligne)
Richard Hoskins le