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

45787
Richard Hoskins

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

42
Was ich mich wundere ist, wie Sie es unter Windows machen würden ... itsadok vor 14 Jahren 0
Should this be on stackoverflow? For superuser the answer is Notepad & lots of patience. kokos vor 14 Jahren 3
Möchten Sie also ein vorangestelltes oder angehängtes Element verwenden? Ihre Titel- und Body-Texte sind unterschiedlich;) matpie vor 14 Jahren 1
Ich denke, ich möchte an den Anfang * anhängen, wobei "Voranstellen" nur ein Wort für Hacker ist. Richard Hoskins vor 14 Jahren 0
Unter Windows können Sie, wie bei jeder anderen Programmierfrage, Cygwin installieren und dann die unten stehenden Antworten verwenden. Jonathan Hartley vor 10 Jahren 0

9 Antworten auf die Frage

51
ACoolie

Der Befehl nl sollte dies tun, fügt jedoch auch Platz vor der Zeilennummer ein. Es ist Teil von Linux-Kernprodukten.

nl lines.txt 1 $bkWTN 2 $cV8$. 
Tatsächlich können Sie "nl" anweisen, das Leerzeichen vor der Nummer wegzulassen. Verwenden Sie einfach die Option -w1, um anzugeben, dass die Mindestbreite für eine Zahl 1 ist. cjm vor 11 Jahren 4
Beachten Sie, dass "nl" standardmäßig davon ausgeht, dass Ihr Text in "Seiten" mit Kopf- und Fußzeilen unterteilt ist, die alle durch Zeilen wie "\:" oder "\: \:" oder "\: \: \: \" getrennt sind. Wenn in Ihrem Text solche Zeilen enthalten sind, führt 'nl' zu unerwarteten Ergebnissen, z. B. das Verschlucken dieser Zeilen, Abschnitte ohne Nummerierung oder das Neustarten 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 vorhersagbar. Daher würde ich empfehlen, eine der anderen Lösungen auf dieser Seite zu verwenden. Jonathan Hartley vor 10 Jahren 2
Wenn Sie '-w1' verwenden, wird nicht nur das Leerzeichen nach den Zahlen entfernt, sondern die Zeilennummern * werden nur auf ein Zeichen breit, dh die Zeilennummern werden nur mit der niedrigstwertigen Ziffer angezeigt. Das ist fast sicher nicht das, was Sie wollen. Jonathan Hartley vor 10 Jahren 0
Mit "-nln" können Sie linksbündig machen, wenn Sie die Leerzeichen vor den Zeilennummern nicht möchten. Um ein Tabulator-Trennzeichen anzugeben, können Sie auch `-s $ '\ t'` oder` -s' '`verwenden (fügen Sie einen Tab zwischen die einfachen Anführungszeichen mit` ctrl + v` und dann `tab`) ein. don_crissti vor 9 Jahren 4
@JonathanHartley `nl -w1` (von GNU coreutils 8.24) schneidet * nicht * die Zeilennummern ab. Skippy le Grand Gourou vor 6 Jahren 1
Das ist falsch. Zeilen, die aus Zeilennummern bestehen, werden übersprungen / nicht gezählt. Die akzeptierte Antwort funktioniert. oligofren vor 6 Jahren 0
49
pgs
awk '' < filename 
Oder "awk" '`. jtbandes vor 14 Jahren 10
Antwort unten, mit nl Befehlszeile, ist eine viel einfachere Lösung. Daniel Ribeiro vor 11 Jahren 0
@DanielRibeiro einfacher, aber weniger zuverlässig und weniger flexibel. Jonathan Hartley vor 10 Jahren 2
@DanielRibeiro Die Antwort mit `nl` ist auch FALSCH. Im Quellcode erhalten Sie niemals die richtigen Zeilennummern, da Zeilen nicht nur mit Leerzeichen gezählt werden. oligofren vor 6 Jahren 0
9
Callum
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 (z. B. Zeilennummer und Zeile) ab und ersetzt den Wagenrücklauf durch einen Tabulator.

Prints a "t" with no tab with my version of sed: 8t I saw the best minds of my generation destroyed by 9t madness, starving hysterical naked, Richard Hoskins vor 14 Jahren 0
Beachten Sie, dass "\ n" Zeilenvorschub ist (im Allgemeinen nur "Newline" genannt, da er zum ersten Mal in Unix verwendet wurde) und "\ r" Wagenrücklauf ist. Windows verwendet `\ r \ n` (auch als` CRLF` bezeichnet). Camilo Martin vor 9 Jahren 0
(Ja, pingelig!) Camilo Martin vor 9 Jahren 0
Wenn wir uns ein wenig mit dem Thema Pivoting beschäftigen wollen, wie sich Fenster unterscheiden könnten, müssen wir möglicherweise UTF16 in Betracht ziehen. mc0e vor 7 Jahren 0
4
raspi
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/" 

cat -n fügt als "123 linecontents" Leinennummern hinzu und ändert diese durch regexp in "LeinennummerTABlinecontents".

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

oder

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

Wie wäre es mit

cat -n somefile.txt 

?

Kein Tab (Kommentare, die 15 Zeichen benötigen, sind eine dumme Voraussetzung.) Richard Hoskins vor 14 Jahren 1
Dies erzeugt Registerkarten auf meinem System. Katze (GNU coreutils) 6.10. innaM vor 14 Jahren 1
On my system, it adds (tab)number(space)line. BSD Utils. Richard Hoskins vor 14 Jahren 0
2
P. Heffner

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 den IFS auf den Standard zurück.

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

1
chaos
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 Tab mit meiner Version von sed. Richard Hoskins vor 14 Jahren 0
Bearbeitet, um doppelt zu entkommen; probier es so aus. chaos vor 14 Jahren 0
If all else fails, just hit tab. :) (Or ^V tab if your shell gives you trouble with that.) chaos vor 14 Jahren 0
sed: 1: "test.txt": nicht definiertes Label 'est.txt' Richard Hoskins vor 14 Jahren 0
'cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'druckt (Tab) Nummer (Leerzeichen) \ t (Zeile) Richard Hoskins vor 14 Jahren 0
Okay, zwei Versionen, die zweite für Ihren `sed`, beide wollen den führenden Tab` cat -n` mögen. chaos vor 14 Jahren 0
Nebenbei, mein Sed ist nicht alt. Es ist einfach nicht GNU. :) Richard Hoskins vor 14 Jahren 0
Ordnungsgemäß vermerkt, bearbeitet per. :) chaos vor 14 Jahren 0
1
nik

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, dass SU Sie nicht Ihren eigenen Beitrag löschen lässt? Kevin M vor 14 Jahren 0
grep + sed == awk Tadeusz A. Kadłubowski vor 14 Jahren 0