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脚本,我想增加我的正则表达式
在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)
我只是用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)
归档时间: |
|
查看次数: |
456 次 |
最近记录: |