在 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
。有关两种方法的优缺点的讨论,请参阅 :)
的进一步贡献(甚至更短!)
$ awk '{print i+=([=12=]!=p),p=[=12=]}' file
此版本在 print
语句中执行加法赋值和基本赋值。这是有效的,因为每个分配的 return 值是已分配的值。
正如评论中所指出的,如果文件的第一行是空的,行为会略有变化。假设第一行应始终以 1
开头,可以将以下块添加到任何一行的开头:
NR==1{p=[=13=];i=1}
即在第一行,将 p
初始化为该行的内容(无论是否为空),并将 i
初始化为 1
。感谢 Wintermute 的建议。
假设我有以下文字。
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
。有关两种方法的优缺点的讨论,请参阅
$ awk '{print i+=([=12=]!=p),p=[=12=]}' file
此版本在 print
语句中执行加法赋值和基本赋值。这是有效的,因为每个分配的 return 值是已分配的值。
正如评论中所指出的,如果文件的第一行是空的,行为会略有变化。假设第一行应始终以 1
开头,可以将以下块添加到任何一行的开头:
NR==1{p=[=13=];i=1}
即在第一行,将 p
初始化为该行的内容(无论是否为空),并将 i
初始化为 1
。感谢 Wintermute 的建议。