假设我有以下文字。
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的建议。