Wie kann ich jeder Zeile einer Textdatei eine Zeilennummer und einen Tabulator voranstellen?

45

Wie kann ich eine Zeilennummer und einen Tabulator an den Anfang jeder Zeile einer Textdatei anhängen?

Richard Hoskins
quelle
Was ich mich frage, ist, wie Sie es unter Windows tun würden ...
itsadok
4
Sollte dies auf Stapelüberlauf sein? Für Superuser lautet die Antwort Notepad & viel Geduld.
Kokos
2
Möchten Sie also voranstellen oder anhängen? Ihre Titel- und Körpertexte sind unterschiedlich;)
Matpie
Ich denke, ich möchte an den Anfang anhängen , "voranstellen" ist nur ein Wort für Hacker.
Richard Hoskins
Unter Windows können Sie, wie bei jeder anderen Frage zur Programmierung, Cygwin installieren und dann die folgenden Antworten verwenden.
Jonathan Hartley

Antworten:

49
awk '{printf "%d\t%s\n", NR, $0}' < filename
pgs
quelle
10
Oder awk '{print NR, "\t", $0}'.
jtbandes
1
Die Antwort unten mit der Befehlszeile nl ist eine viel einfachere Lösung.
Daniel Ribeiro
2
@DanielRibeiro einfacher, aber weniger zuverlässig und weniger flexibel.
Jonathan Hartley
@ DanielRibeiro Die Antwort mit nlist auch falsch. Im Quellcode werden niemals die richtigen Zeilennummern angegeben, da Zeilen mit Leerzeichen nicht gezählt werden.
Oligofren
@jtbandes Ihre Lösung fügt Leerzeichen zwischen der Zeilennummer und dem Tabulator hinzu (zumindest auf meinem Mac)
Yossi Vainshtein
55

Der Befehl nl sollte dies tun, es wird jedoch auch ein Leerzeichen vor der Zeilennummer eingefügt. Es ist Teil von Linux Coreutils.

nl lines.txt
 1  $bkWTN
 2  $cV8$.
ACoolie
quelle
4
Eigentlich kann man sagen nl, das Leerzeichen vor der Nummer wegzulassen. Verwenden Sie einfach die -w1Option, um
anzugeben
2
Beachten Sie, dass 'nl' standardmäßig davon ausgeht, dass Ihr Text in 'Seiten' mit Kopf- und Fußzeilen aufgeteilt ist, die durch Zeilen wie '\:' oder '\: \:' oder '\: \: \:' getrennt sind. Wenn Ihr Text Zeilen wie diese enthält, führt 'nl' zu unerwarteten Ergebnissen, z. B. zum Verschlucken dieser Zeilen oder Abschnitte ohne Nummerierung oder zum Neustart der Nummerierung von 1 in einem Abschnitt. Verwenden Sie -dXY (wobei XY ein Zeichenpaar ist, das in Ihrem Text nicht in einer eigenen Zeile vorkommt), um dieses Verhalten zu verhindern. Im allgemeinen Fall ist dies möglicherweise schwer vorherzusagen. Daher würde ich die Verwendung einer der anderen Lösungen auf dieser Seite empfehlen.
Jonathan Hartley
Mit ‚-W 1‘ wird nicht nur den Raum , nachdem die Zahlen entfernen, sondern auch gestutzt die Zeilennummern nur breit ein Zeichen sein, Ihre Zeilen Zahlen bedeuten nur ihre niedrigstwertigen Stelle angezeigt werden soll . Das ist mit ziemlicher Sicherheit nicht das, was Sie wollen.
Jonathan Hartley
4
Mit können -nlnSie linksbündig ausrichten, wenn Sie nicht möchten, dass die Leerzeichen vor den Zeilennummern stehen. Auch, um eine Registerkarte angeben Separator Sie könnten verwenden -s$'\t'oder -s' '(Einsatz einer Lasche zwischen den einfachen Anführungszeichen mit ctrl+vdann tab).
don_crissti
2
@JonathanHartley nl -w1(von GNU 8,24 coreutils) hat nicht die Zeilennummern gestutzt.
Skippy le Grand Gourou
10
sed = test.txt | sed 'N;s/\n/\t/'

Der Befehl "sed =" gibt die Zeilennummer gefolgt von einem Wagenrücklauf und der nächsten Zeile aus.

Der Ausdruck "N; s / \ n / \ t /" nimmt jede Zeile, ruft die nächste Zeile ab (dh Zeilennummer und Zeile) und ersetzt den Wagenrücklauf durch ein Tabulatorzeichen.

Callum
quelle
Druckt ein "t" ohne Tab mit meiner Version von sed: 8t Ich sah die besten Köpfe meiner Generation durch 9t Wahnsinn zerstört, hysterisch nackt hungern,
Richard Hoskins
1
Beachten Sie, dass \nes sich um Zeilenvorschub (im Allgemeinen nur als "Zeilenvorschub" bezeichnet, da er zum ersten Mal unter Unix verbreitet war) und Zeilenumbruch \rhandelt. Windows verwendet \r\n(auch bezeichnet als CRLF).
Camilo Martin
(Yay Nitpicking!)
Camilo Martin
Wenn wir uns nicht mit der Frage befassen, wie sich die Fenster unterscheiden könnten, müssen wir möglicherweise UTF16 berücksichtigen.
mc0e
4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n fügt Linenumbers als "123 linecontents" hinzu und dieser reguläre Ausdruck ändert es in "linenumberTABlinecontents"

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

oder

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

Wie wäre es mit

cat -n somefile.txt

?

innaM
quelle
1
Keine Registerkarte. (Kommentare benötigen 15 Zeichen ist eine dumme Voraussetzung.)
Richard Hoskins
1
Dies erzeugt Registerkarten auf meinem System. cat (GNU coreutils) 6.10.
21.
Auf meinem System wird eine (Tabulator-) Nummer (Leerzeichen) hinzugefügt. BSD Utils.
Richard Hoskins
2

OK, hier ist eine einzeilige Bash-Lösung:

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

Die erste IFS-Einstellung weist bash an, jeweils eine vollständige Zeile zu lesen. Die zweite Zeile setzt das IFS auf den Standard zurück.

Als zusätzlichen Bonus läuft es komplett in Ihrer Shell und führt kein Programm aus!

P. Heffner
quelle
1

Ok, da wir Möglichkeiten sammeln, dies zu tun,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 
nik
quelle
Jetzt sehe ich das. OK, lösche meinen eigenen Beitrag. Was? Sie sagen, SU lässt Sie Ihren eigenen Beitrag nicht löschen?
Kevin M
grep + sed == awk
Tadeusz A. Kadłubowski
1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

oder für einige Nicht-GNUs sed:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'
Chaos
quelle
Druckt ein "t" ohne Tabulator mit meiner Version von sed.
Richard Hoskins
Bearbeitet zur Doppelflucht; versuch es mal so.
Chaos
Wenn alles andere fehlschlägt, drücken Sie einfach die Tabulatortaste. :) (Oder ^ V Registerkarte, wenn Ihre Shell Ihnen Probleme damit gibt.)
Chaos
sed: 1: "test.txt": undefined label 'est.txt'
Richard Hoskins
'cat test.txt | sed-es / ^ / \\ t / '| cat -n druckt (tab) nummer (Leerzeichen) \ t (Zeile)
Richard Hoskins