Як я можу додати номер рядка та вкладки до кожного рядка текстового файлу?


45

Як я можу додати номер рядка та вкладку до початку кожного рядка текстового файлу?


Мені цікаво, як би ви це зробили в Windows ...
itsadok

4
Чи повинно це бути в потоковому потоці? Для суперпользователя відповідь - Блокнот і багато терпіння.
кокос

2
Отже, ви хочете додати або додати. Ваші заголовки та тексти тексту різні;)
матір

Напевно, я хочу додати до початку , "прикидаючись", будучи лише словом для хакерів.
Річард Хоскінс

У Windows, як і в будь-якому іншому питанні щодо програмування, ви можете встановити Cygwin, а потім скористатись наведеними нижче відповідями.
Джонатан Хартлі

Відповіді:


49
awk '{printf "%d\t%s\n", NR, $0}' < filename

10
Або awk '{print NR, "\t", $0}'.
jtbandes

1
відповідь нижче, з командним рядком nl - набагато простіше рішення.
Даніель Рібейро

2
@DanielRibeiro простіший, але менш надійний і менш гнучкий.
Джонатан Хартлі

@DanielRibeiro Відповідь, яка використовується nl, також WRONG. У вихідному коді він ніколи не дасть вам правильних номерів рядків, оскільки він не рахує рядки з лише пробілом.
олігофрен

@jtbandes Ваше рішення додає пробіли між номером рядка та вкладкою (принаймні, на моєму комп'ютері)
Yossi Vainshtein,

55

Команда nl повинна це робити, але вона додає пробіл і до номера рядка. Це частина основних Linux-систем.

nl lines.txt
 1  $bkWTN
 2  $cV8$.

4
Власне, ви можете сказати nlпропустити пробіл перед цифрою. Просто скористайтеся -w1опцією, щоб сказати, що мінімальна ширина для числа - 1.
cjm

2
Не забудьте, що "nl" за замовчуванням передбачає, що ваш текст розділений на "сторінки" із заголовками та колонтитулами, усі вони розділені рядками типу "\:" або "\: \:" або "\: \: \: '. Якщо у вашому тексті є такі подібні рядки, 'nl' призведе до несподіваних результатів, таких як проковтування цих рядків, розділів без нумерації або перезапуск нумерації з 1 у розділі. Використовуйте -dXY (де XY - пара символів, які не трапляються самі по собі в тексті), щоб запобігти цій поведінці. У загальному випадку це може бути важко передбачити, тому я рекомендую використовувати одне з інших рішень на цій сторінці.
Джонатан Хартлі

Використання '-w1' не просто видалить пробіл після цифр, але й уріже номери рядків лише на один символ, тобто цифри рядків відображають лише найменш значущу цифру. Це майже точно не те, що ви хочете.
Джонатан Хартлі

4
З -nlnви можете лівий виправдати , якщо ви не хочете , щоб простір (и) перед номерами рядків. Крім того, щоб вказати роздільник вкладок, який ви можете використовувати -s$'\t'або -s' '(вставити вкладку між окремими лапками з ctrl+vпотім tab).
don_crissti

2
@JonathanHartley nl -w1(від GNU coreutils 8.24) не врізає номери рядків.
Skippy le Grand Gourou

10
sed = test.txt | sed 'N;s/\n/\t/'

Команда "sed =" друкує номер рядка з подальшим поверненням каретки, а потім наступним рядком.

Вираз "N; s / \ n / \ t /" візьме кожен рядок, отримає наступний рядок (тобто номер рядка та рядок) та замінить повернення каретки на вкладку.


Друкує "t" без вкладки з моєю версією sed: 8t Я бачив, як найкращі розуми мого покоління були зруйновані божевіллям 9-ти, голодували істеричними голими,
Річард Хоскінс

1
Зауважимо, що \nце канал каналів (зазвичай його називають просто "новим рядком", оскільки його перше поширення було використано в Unix), і \rце повернення вагона. Windows використовує \r\n(також званий CRLF).
Каміло Мартін

(Yay nitpicking!)
Каміло Мартін

Якщо ми будемо вникати в роздуми про те, як вікна можуть відрізнятися, то нам може знадобитися розглянути UTF16.
mc0e

4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n додає числові номери як "123 лінійних вмісту", і це повторне оновлення модифікує його на "linenumberTABlinecontents"



2

Як щодо

cat -n somefile.txt

?


1
Немає вкладки. (Коментарі, які потребують 15 символів, - дурна вимога.)
Річард Хоскінс

1
Це створює вкладки в моїй системі. кіт (GNU coreutils) 6.10.
innaM

У моїй системі він додає рядок (вкладка) номер (пробіл). Утиліти BSD.
Річард Хоскінс

2

Добре, ось однолінійне рішення bash:

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

Перша настройка IFS вказує bash за один раз читати повний рядок. Другий рядок скидає IFS за замовчуванням.

Як додатковий бонус, він працює повністю у вашій оболонці і не виконує програми!


1

Гаразд, оскільки ми збираємо способи зробити це,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 

Тепер я це бачу. Гаразд, видаліть мою власну публікацію. Що? Ви кажете, що SU не дозволяє видалити власну публікацію?
Кевін М

grep + sed == awk
Tadeusz A. Kadłubowski

1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

або для деяких не-GNU sed:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'

Друкує "t" без вкладки з моєю версією sed.
Річард Хоскінс

Відредаговано для подвійного втечі; спробуйте так.
хаос

Якщо все не вдалося, просто натисніть на вкладку. :) (Або ^ V вкладка, якщо ваша оболонка створює проблеми з цим.)
хаос

sed: 1: "test.txt": невизначена мітка 'est.txt'
Річард Хоскінс

'cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'друкує (вкладка) номер (пробіл) \ t (рядок)
Річард Хоскінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.