¿Cómo puedo anteponer un número de línea y una pestaña a cada línea de un archivo de texto?


45

¿Cómo puedo agregar un número de línea y una pestaña al comienzo de cada línea de un archivo de texto?


Lo que me pregunto es cómo usted lo haría en Windows ...
itsadok

44
¿Debería estar esto en stackoverflow? Para el superusuario, la respuesta es el Bloc de notas y mucha paciencia.
kokos

2
Entonces, ¿quieres anteponer o agregar? El título y los textos del cuerpo son diferentes;)
matpie

Supongo que quiero agregar al principio , "anteponer" es solo una palabra para los hackers.
Richard Hoskins el

En Windows, como con cualquier otra pregunta de programación, puede instalar Cygwin y luego usar las respuestas a continuación.
Jonathan Hartley

Respuestas:


49
awk '{printf "%d\t%s\n", NR, $0}' < filename

10
O awk '{print NR, "\t", $0}'.
jtbandes

1
La respuesta a continuación, con la línea de comando nl, es una solución mucho más simple.
Daniel Ribeiro

2
@DanielRibeiro más simple pero menos confiable y menos flexible.
Jonathan Hartley

@DanielRibeiro La respuesta usando nltambién es INCORRECTA. En el código fuente, nunca le dará los números de línea correctos, ya que no cuenta líneas con solo espacios en blanco.
oligofren

@jtbandes Su solución agrega espacios entre el número de línea y la pestaña (al menos en mi Mac)
Yossi Vainshtein

55

El comando nl debería hacer esto, pero también agrega espacio antes del número de línea. Es parte de los coreutils de Linux.

nl lines.txt
 1  $bkWTN
 2  $cV8$.

44
En realidad, puede decir nlque omita el espacio antes del número. Simplemente use la -w1opción para indicarle que el ancho mínimo para un número es 1.
cjm

2
Tenga en cuenta que 'nl' asume por defecto que su texto está dividido en 'páginas' con encabezados y pies de página, todos delimitados por líneas como '\:' o '\: \:' o '\: \: \:'. Si su texto tiene líneas como esta, entonces 'nl' producirá resultados inesperados, como tragar esas líneas, secciones sin numeración o reiniciar la numeración desde 1 en una sección. Use -dXY (donde XY es un par de caracteres que no aparecen en una línea en su texto) para evitar este comportamiento. En el caso general, esto puede ser difícil de predecir, por lo que recomendaría usar una de las otras soluciones en esta página.
Jonathan Hartley

El uso de '-w1' no solo eliminará el espacio después de los números, sino que también truncará los números de línea para que solo tengan un carácter de ancho, lo que significa que sus números de líneas solo muestran su dígito menos significativo. Esto es casi seguro que no es lo que quieres.
Jonathan Hartley

44
Con -nlnusted puede justificar a la izquierda si no desea los espacios antes de los números de línea. Además, para especificar un separador de pestañas que podría usar -s$'\t'o -s' '(inserte una pestaña entre las comillas simples con ctrl+ventonces tab).
don_crissti

2
@JonathanHartley nl -w1(de GNU coreutils 8.24) no trunca los números de línea.
Skippy le Grand Gourou

10
sed = test.txt | sed 'N;s/\n/\t/'

El comando "sed =" imprimirá el número de línea seguido de un retorno de carro y luego la siguiente línea.

La expresión "N; s / \ n / \ t /" tomará cada línea, obtendrá la siguiente línea (es decir, el número de línea y la línea) y reemplazará el retorno de carro con una pestaña.


Imprime una "T" con ninguna ficha con mi versión de sed: 8t Vi las mejores mentes de mi generación destruidas por la locura 9t, famélicos, histéricos, desnudos,
Richard Hoskins

1
Tenga en cuenta que \nes el avance de línea (comúnmente llamado simplemente "nueva línea", ya que su primer uso generalizado fue en Unix), y \res el retorno de carro. Usos de Windows \r\n(también conocidos como CRLF).
Camilo Martin

(¡Qué asco!)
Camilo Martin

Si vamos a entrar en detalles sobre cómo las ventanas pueden ser diferentes, entonces es posible que debamos considerar UTF16.
mc0e

4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n agrega números de lino como "123 contenidos de línea" y esa expresión regular lo modifica a "lino número de contenido de línea B"


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

o

perl -ne "print qq($.\t$_)" file.txt

2

Qué tal si

cat -n somefile.txt

?


1
Sin pestaña (Comentarios necesitan 15 caracteres es un requisito estúpida.)
Richard Hoskins

1
Esto produce pestañas en mi sistema. cat (GNU coreutils) 6.10.
innaM

En mi sistema, agrega la línea (espacio) número (tabulación). BSD Utils.
Richard Hoskins el

2

OK, aquí hay una solución bash de una línea:

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

La primera configuración de IFS le dice a bash que lea una línea completa a la vez. La segunda línea restablece el IFS al valor predeterminado.

Como una ventaja adicional, se ejecuta completamente en su shell y no ejecuta un programa.


1

Ok, ya que estamos recopilando formas de hacer esto,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 

Ahora veo esto. OK, borra mi propia publicación. ¿Qué? ¿Dices que SU no te permite eliminar tu propia publicación?
Kevin M

grep + sed == awk
Tadeusz A. Kadłubowski

1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

o para algunos no GNU sed:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'

Imprime una "t" sin pestaña con mi versión de sed.
Richard Hoskins el

Editado para doble escape; Pruébalo así.
caos

Si todo lo demás falla, solo presiona la pestaña. :) (O ^ V pestaña si su shell le da problemas con eso.)
caos

sed: 1: "test.txt": etiqueta indefinida 'est.txt'
Richard Hoskins el

'cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'imprime (tabulador) número (espacio) \ t (línea)
Richard Hoskins
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.