从数字1开始,如何在一个段落中的每一行前面添加相同的数字和空格, 对于数字2和下一段也是如此。 段落用空行分隔,文本文件中的大约50个段落,每个段落 有2到30行。
这里的一些文字
更多数字和文字
此处更多文字
这里有更多文字
数字文字
这里有一些文字
还有1个数字和文字
这里有2个文字
2,这里有更多文字
2号文字
答案 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///
标志启用“多行”模式,因此^
匹配字符串每行的开头。