Jak mogę wstawić numer linii i tabulatory do każdej linii pliku tekstowego?

45

Jak mogę dołączyć numer linii i tabulator na początku każdej linii pliku tekstowego?

Richard Hoskins
źródło
Zastanawiam się, jak zrobiłbyś to w systemie Windows ...
itsadok
4
Czy powinno to dotyczyć przepływu stosu? Dla superużytkownika odpowiedzią jest Notatnik i dużo cierpliwości.
kokos
2
Więc chcesz dodać lub dołączyć. Twój tytuł i
treść
Chyba chcę dopisać na początku , „prepend” to tylko słowo dla hakerów.
Richard Hoskins,
W systemie Windows, podobnie jak w przypadku innych pytań programistycznych, możesz zainstalować Cygwin, a następnie skorzystać z poniższych odpowiedzi.
Jonathan Hartley,

Odpowiedzi:

49
awk '{printf "%d\t%s\n", NR, $0}' < filename
pgs
źródło
10
Lub awk '{print NR, "\t", $0}'.
jtbandes
1
odpowiedź poniżej z wierszem poleceń nl jest znacznie prostszym rozwiązaniem.
Daniel Ribeiro,
2
@DanielRibeiro prostsze, ale mniej niezawodne i mniej elastyczne.
Jonathan Hartley,
@DanielRibeiro Użycie odpowiedzi nljest również NIEPRAWIDŁOWE. W kodzie źródłowym nigdy nie da ci prawidłowych numerów linii, ponieważ nie liczy linii z białymi spacjami.
oligofren,
@jtbandes Twoje rozwiązanie dodaje spacje między numerem wiersza a tabulatorem (przynajmniej na moim komputerze Mac)
Yossi Vainshtein
55

Polecenie nl powinno to zrobić, ale dodaje również spację przed numerem wiersza. Jest to część jądra systemu Linux.

nl lines.txt
 1  $bkWTN
 2  $cV8$.
ACoolie
źródło
4
W rzeczywistości możesz powiedzieć, nlaby pominąć spację przed liczbą. Wystarczy użyć -w1opcji, aby powiedzieć, że minimalna szerokość dla liczby wynosi 1.
cjm
2
Uważaj, że „nl” domyślnie zakłada, że ​​twój tekst jest podzielony na „strony” z nagłówkami i stopkami, wszystkie ograniczone liniami takimi jak „\:” lub „\: \:” lub „\: \: \:”. Jeśli w tekście są takie linie, to „nl” da nieoczekiwane rezultaty, takie jak połknięcie tych linii, sekcji bez numeracji lub ponowne uruchomienie numeracji od 1 w sekcji. Użyj -dXY (gdzie XY to para znaków, które same nie występują w linii w tekście), aby zapobiec takiemu zachowaniu. W ogólnym przypadku może to być trudne do przewidzenia, dlatego polecam użycie jednego z innych rozwiązań na tej stronie.
Jonathan Hartley,
Korzystanie „-W1” nie będzie po prostu usunąć spację po numerach, ale będzie również obciąć numery linii być tylko jedna postać szeroko, czyli numery linii wyświetlać tylko ich najmniej znaczącej cyfry. To prawie na pewno nie to, czego chcesz.
Jonathan Hartley,
4
Dzięki -nlnmożesz uzasadnić w lewo, jeśli nie chcesz spacji przed numerami wierszy. Ponadto, aby określić kartę separatora można użyć -s$'\t'lub -s' '(Włóż kartę między apostrofami z ctrl+vpotem tab).
don_crissti
2
@JathanathanHartley nl -w1(z GNU coreutils 8.24) nie obcina numerów linii.
Skippy le Grand Gourou
10
sed = test.txt | sed 'N;s/\n/\t/'

Polecenie „sed =” wypisze numer wiersza, a następnie znak powrotu karetki, a następnie następny wiersz.

Wyrażenie „N; s / \ n / \ t /” zajmie każdą linię, pobierze następną linię (tj. Numer linii i linię) i zastąpi znak powrotu karetki znakiem tabulacji.

Callum
źródło
Drukuje „t” bez zakładki w mojej wersji sed: 8t Widziałem, jak najlepsze umysły mojego pokolenia zostały zniszczone przez szaleństwo 9t, głodując histerycznie nago,
Richard Hoskins
1
Zauważ, że \njest to wysuw wiersza (zwykle nazywany po prostu „nowym wierszem”, ponieważ jego pierwsze powszechne użycie miało miejsce w Uniksie) i \rjest znakiem powrotu karetki. Używa systemu Windows \r\n(zwanego także CRLF).
Camilo Martin,
(Yay nitpicking!)
Camilo Martin
Jeśli mamy zamiar zacząć zastanawiać się nad tym, jak okna mogą się różnić, może być konieczne rozważenie UTF16.
mc0e
4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n dodaje numery pościeli jako „123 elementy linii”, a wyrażenie regularne modyfikuje je do „pościeliTablinecontents”

raspi
źródło
3
perl -pe "s/^/$.\t$_/" file.txt

lub

perl -ne "print qq($.\t$_)" file.txt
itsadok
źródło
2

Co powiesz na

cat -n somefile.txt

?

innaM
źródło
1
Bez karty. (Komentarze wymagające 15 znaków są głupim wymogiem.)
Richard Hoskins,
1
Powoduje to utworzenie zakładek w moim systemie. cat (GNU coreutils) 6.10.
innaM
W moim systemie dodaje (tab) numer wiersza (spacji). BSD Utils.
Richard Hoskins
2

OK, oto jedno-liniowe rozwiązanie bash:

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

Pierwsze ustawienie IFS każe bashowi czytać jednocześnie pełną linię. Druga linia resetuje IFS do wartości domyślnych.

Jako dodatkowy bonus, działa całkowicie w twojej powłoce i nie wykonuje programu!

P. Heffner
źródło
1

Ok, ponieważ zbieramy sposoby, aby to zrobić,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 
nik
źródło
Teraz to widzę. OK, usuń mój własny post. Co? Mówisz, że SU nie pozwala ci usunąć własnego postu?
Kevin M
grep + sed == awk
Tadeusz A. Kadłubowski
1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

lub dla niektórych nie-GNU sed:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'
chaos
źródło
Drukuje „t” bez tabulatora w mojej wersji sed.
Richard Hoskins
Edytowane do podwójnej ucieczki; spróbuj tego w ten sposób.
chaos
Jeśli wszystko inne zawiedzie, po prostu naciśnij klawisz Tab. :) (Lub zakładka ^ V, jeśli twoja powłoka sprawia ci z tym problem.)
chaos
sed: 1: „test.txt”: niezdefiniowana etykieta „est.txt”
Richard Hoskins
„cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'drukuje (tab) numer (spacja) \ t (linia)
Richard Hoskins