Как можно добавить номер строки и табуляцию к каждой строке текстового файла?

45

Как я могу добавить номер строки и табуляцию в начало каждой строки текстового файла?

Ричард Хоскинс
источник
Что мне интересно, так это то, как ты это делаешь в Windows ...
itadok
4
Это должно быть на стеке потока? Для суперпользователя ответ - Блокнот и много терпения.
Кокос
2
Итак, вы хотите добавить или добавить. Ваш заголовок и основной текст разные;)
matpie
Думаю, я хочу добавить к началу , «prepend» - это всего лишь слово для хакеров.
Ричард Хоскинс
В Windows, как и в случае с любым другим вопросом программирования, вы можете установить Cygwin, а затем использовать ответы ниже.
Джонатан Хартли

Ответы:

49
awk '{printf "%d\t%s\n", NR, $0}' < filename
PGS
источник
10
Или awk '{print NR, "\t", $0}'.
jtbandes
1
ответ ниже, с командной строкой nl, является гораздо более простым решением.
Даниэль Рибейро
2
@DanielRibeiro проще, но менее надежен и менее гибок.
Джонатан Хартли
@DanielRibeiro Использование ответа nlтакже НЕПРАВИЛЬНО. В исходном коде он никогда не даст правильные номера строк, поскольку он не считает строки только с пробелами.
oligofren
@jtbandes Ваше решение добавляет пробелы между номером строки и табуляцией (по крайней мере, на моем Mac)
Йосси Вайнштейн
55

Команда nl должна сделать это, но она также добавляет пробел перед номером строки. Это часть Linux Coreutils.

nl lines.txt
 1  $bkWTN
 2  $cV8$.
ACoolie
источник
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 Я видел лучшие умы моего поколения, уничтоженные 9t безумием, истерично голодающими голыми,
Ричард Хоскинс
1
Обратите внимание, что \nэто перевод строки (обычно называемый просто «новой строкой», так как его первое широкое распространение было в Unix), и \rэто возврат каретки. Windows использует \r\n(также упоминается как CRLF).
Камило Мартин
(Yay придирки!)
Камило Мартин
Если мы собираемся вникать в то, как могут отличаться окна, то нам, возможно, придется рассмотреть UTF16.
mc0e
4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n добавляет бельевые числа как "123 linecontents", а регулярное выражение изменяет их на "linenumberTABlinecontents"

raspi
источник
3
perl -pe "s/^/$.\t$_/" file.txt

или

perl -ne "print qq($.\t$_)" file.txt
itsadok
источник
2

Как насчет

cat -n somefile.txt

?

InnaM
источник
1
Нет вкладки. (Комментарии, требующие 15 символов - глупое требование.)
Ричард Хоскинс
1
Это производит вкладки в моей системе. кошка (GNU coreutils) 6.10.
ИннаМ
В моей системе добавляется (табуляция) числовой (пробел) строки. BSD Utils.
Ричард Хоскинс
2

ОК, вот решение для одной строки:

$ 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  =====>  ---- 
Nik
источник
Теперь я вижу это. ОК, удалите мой собственный пост. Какая? Вы говорите, что SU не позволяет вам удалить свой пост?
Кевин М
grep + sed == awk
Тадеуш А. Кадлубовский
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 (строка)
Ричард Хоскинс