начать с числа 1, как добавить тот же номер и пробел перед каждой строкой в ​​одном абзаце, то же самое для номера 2 и следующего абзаца. Абзацы разделяются пустой строкой, примерно 50 абзацев в текстовом файле, каждый абзац имеет от 2 до 30 строк.

здесь какой-то текст
дополнительные номера и текст

подробнее здесь
а вот еще текст
текст номера

1 здесь какой-то текст
Еще 1 номер и текст

еще 2 текста здесь
2 и еще текст
2 цифры текст

user3798565

Ответов: 4

Ответы (4)

Уловка здесь в том, чтобы рассматривать абзацы как записи, а строки как поля.

awk 'BEGIN { RS="\n\n"; FS="\n" }
     { for (i = 1; i <= NF; i++)
         print FNR, $i;
       print "" }' < in > out

С Новым годом!

The perl solution is very compact:

perl -00 -lpe 's/^/$. /mg' file
  • -00 читает файл в режиме абзаца.
  • $. - номер текущей записи
  • флаг m команды s /// включает "многострочный" режим, поэтому ^ соответствует в начале каждой строки строка.

Это позволит использовать несколько пробелов между абзацами или даже перед первым абзацем. Конечно, ваши данные никогда не будут такими, и никогда не будет важно, чтобы номера абзацев были действительно правильными. Но на всякий случай так для кого-то другого.

BEGIN {
    ParaNum = 1
    MultiBlankRecNum = 0
    }
{
if ( NF == 0 ) {
    if ( NR > ( MultiBlankRecNum + 1 ) ) {
        ++ParaNum
        }
    print
    MultiBlankRecNum = NR
    next
    }
print ParaNum, $0 
}

Для немного большего удовольствия, это префикс абзаца, строки в абзаце, затем текстовой строки в файле и номера записи в файле, текущий счет слов и слов в строке.

BEGIN {
    ParaNum = 1
    TextLineInFile = 0
    TextLineInPara = 0
    MultiBlankRecNum = 0
    WordsRunningTotal = 0
    }
{
if ( NF == 0 ) {
    if ( NR > ( MultiBlankRecNum + 1 ) ) {
        ++ParaNum
        }
    print $0
    MultiBlankRecNum = NR
    TextLineInPara = 0
    next
    }

++TextLineInPara 
++TextLineInFile
print ParaNum "." TextLineInPara, TextLineInFile "/" FNR, NF "/" WordsRunningTotal, $0 
WordsRunningTotal += NF
}

другая awk альтернатива, считает пустые строки без циклов.

$ awk '/^$/{c++;print;next} {print c+1, $0}' text  

1 some text here
1 more numbers and text

2 more text here
2 and here is more text
2 number text

это сохраняет количество пустых строк

$ awk '/^$/{e=1;print;next} e{c++} {print c+1,$0;e=0}' text2

1 some text here
1 more numbers and text 


2 more text here
2 and here is more text
2 number text

2022 WebDevInsider