在 AWK 中,如何拆分与 "record" 具有相同字符串的连续行?

In AWK, how to split consecutive rows that have the same string as a "record"?

假设我有以下文字。

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 ([=10=]!=p?++i:i),[=10=];p=[=10=]}' file
1 aaaaaaa
1 aaaaaaa
2 bbb
2 bbb
2 bbb
3 ccccccccccccc
4 ddddd
4 ddddd
只要当前行与上一行不同,

i 就会递增。 p 保存上一行的值,[=16=].

或者,按照 JID 的建议:

awk '[=11=]!=p{p=[=11=];i++}{print i,[=11=]}' file

当当前行与p不同时,替换p并递增i。有关两种方法的优缺点的讨论,请参阅 :)

NeronLeVelu

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

此版本在 print 语句中执行加法赋值和基本赋值。这是有效的,因为每个分配的 return 值是已分配的值。


正如评论中所指出的,如果文件的第一行是空的,行为会略有变化。假设第一行应始终以 1 开头,可以将以下块添加到任何一行的开头:

NR==1{p=[=13=];i=1}

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