awk 对每一段中的所有行进行编号,每段增加一

awk numbering all lines in each paragraph, increasing by one for each paragraph

从数字 1 开始如何在一个段落的每一行前面添加相同的数字和一个 space, 第 2 段和下一段相同。 段落之间用空行分隔,文本文件中大约有50个段落,每个段落 有 2 到 30 行。

这里有一些文字
更多数字和文字

此处有更多文字
这里有更多文字
数字文本

1 这里有一些文字
还有 1 个数字和文字

此处还有 2 条文字
2 这是更多文字
2 号文字

这里的技巧是将段落视为记录,将行视为字段。

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

新年快乐!

这将允许在段落之间甚至在第一段之前有多个空格。当然,您的数据永远不会像那样,paragraph-numbers 是否正确也永远不会重要。但是,以防万一其他人也是如此。

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

为了更有趣,这为段落、段落中的行、文件中的文本行和文件中的 record-number 添加了前缀,运行 字数和字数这条线。

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

++TextLineInPara 
++TextLineInFile
print ParaNum "." TextLineInPara, TextLineInFile "/" FNR, NF "/" WordsRunningTotal, [=11=] 
WordsRunningTotal += NF
}

另一个awk替代方案,计算空行,没有循环。

$ awk '/^$/{c++;print;next} {print c+1, [=10=]}' 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,[=11=];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

perl 解决方案非常紧凑:

perl -00 -lpe 's/^/$. /mg' file
  • -00 以段落模式读取文件。
  • $.为当前记录号
  • s/// 命令的 m 标志启用 "multi-line" 模式,因此 ^ 在字符串的每一行的开头匹配。