Comment ajouter des numéros de ligne dans chaque ligne en utilisant la commande shell?

21

Mon fichier,

PSS-A  (Primary A)
PSS-B  (Primary B)
PSS-C  (Primary C)
PSS-D  (Primary D)
PSS-E  (Primary E)
PSS-F  (Primary F)
PSS-G  (Primary G)
PSS-H  (Primary H)
PSS-I  (Primary I)
SPARE  (SPARE)

Fichier de sortie,

 1> PSS-A  (Primary A)
 2> PSS-B  (Primary B)
 3> PSS-C  (Primary C)
 4> PSS-D  (Primary D)
 5> PSS-E  (Primary E)
 6> PSS-F  (Primary F)
 7> PSS-G  (Primary G)
 8> PSS-H  (Primary H)
 9> PSS-I  (Primary I)
10> SPARE  (SPARE)
pmaipmui
la source

Réponses:

32

Si vous voulez le même format que vous avez spécifié

awk '{print NR  "> " $s}' inputfile > outputfile

sinon, bien que non standard, la plupart des implémentations de la catcommande peuvent imprimer des numéros de ligne pour vous (nombres remplis à la largeur 6 et suivis par TAB dans au moins les implémentations GNU, busybox, Solaris et FreeBSD).

cat -n inputfile > outputfile

Ou vous pouvez utiliser grep -n(nombres suivis de :) avec une expression rationnelle comme ^celle qui correspond à n'importe quelle ligne:

grep -n '^' inputfile > outputfile
amisax
la source
Oui ... les deux commandes fonctionnent .... mais dans la catcommande son impression des numéros de ligne ... mais pas exactement ce que je voulais .... mais awk '{print NR "> " $s}' inputfile > outputfileme donne la sortie souhaitée .... :-) @amit kumar
pmaipmui
1
Notez également que ce cat -nn'est pas portable. Seule l' -uoption est spécifiée dans POSIXcat .
vinc17
34

Le bon outil pour ce travail est nl:

nl -w2 -s'> ' file

Vous voudrez peut-être régler l' woption idth en fonction du nombre total de lignes dans le fichier (si vous voulez que les nombres soient bien alignés).

Production:

 1> PSS-A  (Primary A)
 2> PSS-B  (Primary B)
 3> PSS-C  (Primary C)
 4> PSS-D  (Primary D)
 5> PSS-E  (Primary E)
 6> PSS-F  (Primary F)
 7> PSS-G  (Primary G)
 8> PSS-H  (Primary H)
 9> PSS-I  (Primary I)
10> SPARE  (SPARE)
jimmij
la source
2
nltraite \:spécialement les lignes contenant une séquence de 1, 2 ou 3 chaînes. Utilisez -d $'\n'pour éviter cela. De plus, par défaut, il ne numérote pas les lignes vides. Utilisez -bapour numéroter chaque ligne.
Stéphane Chazelas
@ StéphaneChazelas en effet, merci beaucoup! Notez que la $'...'syntaxe est spécifique à bash.
myrdd
Mon cœur a coulé quand j'ai vu que seqcela ne le faisait pas. Dieu mercinl
Sridhar Sarnobat
1
@myrdd, $'...'vient de ksh93 et ​​est également supporté par zsh, au moins mksh, busybox sh, FreeBSD sh et bash. Ce n'est pas encore standard, mais il est prévu de l'inclure dans la prochaine version POSIX majeure.
Stéphane Chazelas
@ StéphaneChazelas merci. pour référence, il y a une question sur la $'...'portabilité (ANSI-C Quoting): unix.stackexchange.com/questions/371827/…
myrdd
0

j'ai fait par la méthode ci-dessous

commander: cat -n filename |sed -r "s/^\s+//g"| sed "s/^[0-9]*/&\> /g"

production

cat -n u.txt |sed -r "s/^\s+//g"| sed "s/^[0-9]*/&\> /g"
1>  PSS-A  (Primary A)
2>  PSS-B  (Primary B)
3>  PSS-C  (Primary C)
4>  PSS-D  (Primary D)
5>  PSS-E  (Primary E)
6>  PSS-F  (Primary F)
7>  PSS-G  (Primary G)
8>  PSS-H  (Primary H)
9>  PSS-I  (Primary I)
10>     SPARE  (SPARE)
Praveen Kumar BS
la source