¿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?

Richard Hoskins
fuente
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
pgs
fuente
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$.
Una sociedad
fuente
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.

Callum
fuente
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"

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

o

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

Qué tal si

cat -n somefile.txt

?

innaM
fuente
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.

P. Heffner
fuente
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  =====>  ---- 
nik
fuente
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//'
caos
fuente
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