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" 模式,因此 ^
在字符串的每一行的开头匹配。
从数字 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" 模式,因此^
在字符串的每一行的开头匹配。