Vim Regex重复行分组

Ste*_*eve 4 regex sorting vim awk sed

我有一个这样的日志文件:

12 adsflljl
12 hgfahld
12 ash;al
13 a;jfda
13 asldfj
15 ;aljdf
16 a;dlfj
19 adads
19 adfasf
20 aaaadsf
Run Code Online (Sandbox Code Playgroud)

我想将它们"分组",就像这两个中的一个:

12 adsfllj, 12 hgfahld, 12 ash;al
13 a;jfda, 13 asldfj
15 ;aljdf
16 a;dlfj
19 adads, 19 adfasf
20 aaaadsf
Run Code Online (Sandbox Code Playgroud)

要么

12 adsfllj, hgfahld, ash;al
13 a;jfda, asldfj
15 ;aljdf
16 a;dlfj
19 adads, adfasf
20 aaaadsf
Run Code Online (Sandbox Code Playgroud)

我完全陷入困境.如果vim没有这样做,我也有sed和awk以及bash.我只是不想写一个bash脚本,我想增加我的正则表达式

Unc*_*eiv 6

在Vim中你可以使用:

:%s/\(\(\d\+\) .*\)\n\2/\1, \2/g 
Run Code Online (Sandbox Code Playgroud)

这意味着:如果在新行之后匹配一组数字,请删除换行符并放置逗号.如果您不熟悉它们,\1并且\2是反向引用.

不幸的是,这一次只会合并两次,所以在实现目标之前你必须多次运行它.

编辑:一次完成它的一种方法是循环并利用这样一个事实,即一旦文件不再匹配就会发出错误.这个错误虽然有点烦人,但我用单行代码做得不好:

:while 1 | :%s/\(\(\d\+\) .*\)\n\2/\1, \2/g | :endwhile
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

我只是用awk:

awk '
  {
    sep = val[$1] ? ", " : ""
    val[$1] = val[$1] sep $2
  }
  END {for (v in val) print v, val[v]}
' log.file | sort > new.file
Run Code Online (Sandbox Code Playgroud)