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?


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

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

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.


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”


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

lub

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

2

Co powiesz na

cat -n somefile.txt

?


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!


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.