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?


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

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$.

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.


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"


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

oder

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

2

Wie wäre es mit

cat -n somefile.txt

?


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!


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  =====>  ---- 

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//'

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.