Come posso anteporre un numero di riga e una scheda a ciascuna riga di un file di testo?


45

Come posso aggiungere un numero di riga e una scheda all'inizio di ogni riga di un file di testo?


Quello che mi chiedo è come lo faresti su Windows ...
arrivato il

4
Questo dovrebbe essere su StackOverflow? Per i superutente la risposta è Blocco note e molta pazienza.
kokos,

2
Quindi, vuoi anteporre o aggiungere. Il titolo e il testo del testo sono diversi;)
matpie,

Immagino di voler aggiungere all'inizio , "anteporre" è solo una parola per gli hacker.
Richard Hoskins,

Su Windows, come con qualsiasi altra domanda di programmazione, è possibile installare Cygwin e quindi utilizzare le risposte di seguito.
Jonathan Hartley,

Risposte:


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

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

1
la risposta che segue, con la riga di comando nl, è una soluzione molto più semplice.
Daniel Ribeiro,

2
@DanielRibeiro più semplice ma meno affidabile e meno flessibile.
Jonathan Hartley,

@DanielRibeiro Anche la risposta nlè SBAGLIATA. Nel codice sorgente, non ti darà mai i numeri di riga giusti, poiché non conta le righe con solo spazi bianchi.
oligofren,

@jtbandes La tua soluzione aggiunge spazi tra il numero di riga e la scheda (almeno sul mio mac)
Yossi Vainshtein,

55

Il comando nl dovrebbe farlo, ma aggiunge spazio anche prima del numero di riga. Fa parte dei coreutils di Linux.

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

4
In realtà, puoi dire nldi omettere lo spazio prima del numero. Basta usare l' -w1opzione per dirgli che la larghezza minima per un numero è 1.
cjm

2
Fai attenzione che 'nl' presume per impostazione predefinita che il testo sia diviso in 'pagine' con intestazioni e piè di pagina, delimitati da righe come '\:' o '\: \:' o '\: \: \:'. Se il tuo testo contiene righe come questa, allora 'nl' produrrà risultati imprevisti, come ingoiare quelle righe, sezioni senza numerazione o riavviare la numerazione da 1 in una sezione. Usa -dXY (dove XY è una coppia di caratteri che non si presentano su una riga da soli nel testo) per impedire questo comportamento. Nel caso generale, questo potrebbe essere difficile da prevedere, quindi consiglierei di utilizzare una delle altre soluzioni in questa pagina.
Jonathan Hartley,

Usando '-W1' non sarà solo rimuovere lo spazio dopo i numeri, ma anche troncherà i numeri di riga per essere solo un carattere di larghezza, che significa i numeri di linee mostrano solo la loro cifra meno significativa. Questo non è quasi certamente quello che vuoi.
Jonathan Hartley,

4
Con -nlnte puoi giustificare a sinistra se non vuoi gli spazi prima dei numeri di riga. Inoltre, per specificare un separatore di schede è possibile utilizzare -s$'\t'o -s' '(inserire una scheda tra le virgolette singole con ctrl+vallora tab).
don_crissti,

2
@JonathanHartley nl -w1(da GNU coreutils 8.24) non tronca i numeri di linea.
Skippy le Grand Gourou,

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

Il comando "sed =" stamperà il numero di riga seguito da un ritorno a capo e quindi dalla riga successiva.

L'espressione "N; s / \ n / \ t /" prenderà ogni riga, otterrà la riga successiva (ovvero il numero di riga e la riga) e sostituirà il ritorno a capo con una scheda.


Stampa una "t" senza scheda con la mia versione di sed: 8t Ho visto le migliori menti della mia generazione distrutte dalla follia 9t, affamate isteriche nude,
Richard Hoskins,

1
Si noti che \nè un feed di riga (comunemente chiamato solo "newline", poiché il suo primo utilizzo diffuso era in Unix), ed \rè il ritorno a capo. Windows utilizza \r\n(noto anche come CRLF).
Camilo Martin,

(Yay nitpicking!)
Camilo Martin

Se entreremo nel nitpicking su come Windows potrebbe essere diverso, allora potremmo aver bisogno di considerare UTF16.
MC0e

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

cat -n aggiunge il numero di lino come "123 linecontents" e che regexp lo modifica in "linenumberTABlinecontents"


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

o

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

2

Che ne dite di

cat -n somefile.txt

?


1
Nessuna scheda (I commenti che richiedono 15 caratteri sono un requisito stupido.)
Richard Hoskins,

1
Questo produce schede sul mio sistema. cat (GNU coreutils) 6.10.
innaM

Sul mio sistema, aggiunge (tab) numero (spazio) linea. Utensili BSD.
Richard Hoskins,

2

OK, ecco una soluzione bash a una riga:

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

La prima impostazione IFS dice a bash di leggere una riga intera alla volta. La seconda riga ripristina l'IFS sul valore predefinito.

Come bonus aggiuntivo, viene eseguito completamente nella shell e non esegue un programma!


1

Ok, dal momento che stiamo raccogliendo modi per farlo,

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

Ora vedo questo. OK, elimina il mio post. Che cosa? Dici che SU non ti consente di eliminare il tuo post?
Kevin M,

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

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

o per alcuni non GNU sed:

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

Stampa una "t" senza tabulazione con la mia versione di sed.
Richard Hoskins,

A cura di doppia fuga; provalo così.
caos,

Se tutto il resto fallisce, basta premere la scheda. :) (Oppure ^ V se la tua shell ti dà problemi.)
caos,

sed: 1: "test.txt": etichetta indefinita 'est.txt'
Richard Hoskins,

'cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'stampe (tab) numero (spazio) \ t (linea)
Richard Hoskins
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.