awk编号每个段落中的所有行,每个段落增加一个

时间:2016-01-01 16:17:51

标签: awk gawk

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

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

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

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

这里有2个文字 2,这里有更多文字
2号文字

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

另一个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

答案 2 :(得分:1)

这将允许段落之间或甚至在第一段之前的多个空格。当然,您的数据永远不会那样,并且段落数字实际上是正确的将永远不会是重要的。但是,以防其他人也这样做。

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
}

答案 3 :(得分:0)

perl解决方案非常紧凑:

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