¿Cómo agregar números de línea en cada línea usando el comando de shell?


21

Mi archivo,

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)

Archivo de salida,

 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)

Respuestas:


32

Si desea el mismo formato que ha especificado

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

de lo contrario, aunque no es estándar, la mayoría de las implementaciones del catcomando pueden imprimir números de línea por usted (números rellenados hasta el ancho 6 y seguidos de TAB en al menos las implementaciones GNU, busybox, Solaris y FreeBSD).

cat -n inputfile > outputfile

O puede usar grep -n(números seguidos de :) con una expresión regular como ^esa que coincida con cualquier línea:

grep -n '^' inputfile > outputfile

Sí ... ambos comandos funcionan ... pero al catmando imprime los números de línea ... pero no exactamente lo que quería ... pero awk '{print NR "> " $s}' inputfile > outputfileme da el resultado deseado ... :-) @amit kumar
pmaipmui

1
Tenga en cuenta también que cat -nno es portátil. Solo la -uopción se especifica en POSIXcat .
vinc17

34

La herramienta adecuada para este trabajo es nl:

nl -w2 -s'> ' file

Es posible que desee ajustar la wopción idth de acuerdo con el número total de líneas en el archivo (si desea que los números estén bien alineados).

Salida:

 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
nltrata líneas que contienen una secuencia de 1, 2 o 3 \:cadenas especialmente. Use -d $'\n'para evitar eso. Además, por defecto, no numera líneas vacías. Use -bapara numerar cada línea.
Stéphane Chazelas

@ StéphaneChazelas de hecho, muchas gracias! Tenga en cuenta que la $'...'sintaxis es específica de bash.
myrdd

Mi corazón se hundió cuando vi que eso seqno lo hizo. Gracias a Dios pornl
Sridhar Sarnobat

1
@myrdd, $'...'proviene de ksh93 y también está soportado por zsh, mksh, sh busybox, sh FreeBSD y bash al menos. Todavía no es estándar, pero se planea incluirlo en la próxima versión principal de POSIX.
Stéphane Chazelas

@ StéphaneChazelas gracias. para referencia, hay una pregunta sobre la $'...'portabilidad (Cita ANSI-C): unix.stackexchange.com/questions/371827/…
myrdd

0

Lo he hecho por el siguiente método

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

salida

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.