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)

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

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)

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.