原创文章-awk快捷把一行转换成多行(列转行)

在数据库中经常碰到,把固定分隔符的一行记录转换成多行,如图:

attachments-2016-12-uq63aqUo58482dbc3285

                                                                        图1

我现在想把它转成下图的样式:

attachments-2016-12-Gg1LxLjU58482e4ecf3d

                                                                      图2

在数据库中,通过sql语句可以完成这样的转换,不过sql语句并不简单,事实上还很复杂,我之前写过这方面的帖子,见下面连接:

                                               https://wenda.zuncuang.com/article/17

其实通过linux下的awk命令,可以更快更方面的完成这种转换,加入图1的文本存入ff.txt 中,那么使用如下的shell命令可以非常快速的完成:

                                awk -F '[  \t,]+' '{for(i=2;i<=NF;i++)print $1" "$i }' ff.txt|sed -r   '/\s+$/d'


上面命令最关键的是,awk 的分隔符可以使用正则表达式,本例中正则匹配“空格,制表符和逗号” 然后通过awk的for循环,每行的条件结束为NF(分隔符分割出来的域数),i从2开始

因为i=1的时候,$i 和$1重复;中间很多逗号分隔域中没有内容,去除结果中有很多图片路径为空的,可以进一步通过sed 命令来删除这部分, sed -r 启动的扩展的正则,默认只支持POSIX 基本匹配,比如空格只能使用[ ],启用-r 后空格可以使用\s 匹配,\s 也可以匹配制表符 \s+$ 表示结尾有多个空格 通过/d指令删除



请先 登录 后评论
  • 0 关注
  • 0 收藏,1051 浏览
  • 石天 提出于 2016-12-07 23:42

相似问题