假设我有以下文字。

aaaaaaa
aaaaaaa
bbb
bbb
bbb
ccccccccccccc
ddddd
ddddd

有没有一种方法可以如下修改文本。
1 aaaaaaa
1 aaaaaaa
2 bbb
2 bbb
2 bbb
3 ccccccccccccc
4 ddddd
4 ddddd

最佳答案

您可以在awk中使用如下所示的内容:

$ awk '{print ($0!=p?++i:i),$0;p=$0}' file
1 aaaaaaa
1 aaaaaaa
2 bbb
2 bbb
2 bbb
3 ccccccccccccc
4 ddddd
4 ddddd

当前行与上一行不同时,i会增加。 p保存上一行的值$0

或者,如JID所建议:
awk '$0!=p{p=$0;i++}{print i,$0}' file

当当前行与p不同时,请替换p并增加i。参见the comments来讨论两种方法的优缺点:)

NeronLeVelu的进一步贡献(甚至更短!)
$ awk '{print i+=($0!=p),p=$0}' file

此版本在print语句中执行添加分配和基本分配。之所以可行,是因为每个分配的返回值都是已分配的值。

如注释中指出的,如果文件的第一行为空,则行为会稍有变化。假设第一行应始终以1开头,则可以将以下代码段添加到任何单行代码的开头:
NR==1{p=$0;i=1}

即在第一行中,将p初始化为该行的内容(是否为空),然后将i初始化为1。感谢Wintermute的建议。

10-02 18:00