mysql - 将带有子线的行转换为单行

标签 mysql linux awk sed

我有一个庞大的文本文件需要导入到 SQL 数据库中。 问题是该文件每条记录包含几行,因此我需要每条记录在一行中的所有内容。

文本文件现在看起来像这样;

L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;

我需要它以这样的方式结束,这样就可以很容易地将它导入到 SQL 数据库中;

是否有任何 SED 命令可用于此转换,还是更好的方法?

L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;

感谢所有有关如何以最佳方式将此数据导入 mySQL 数据库的提示:)

最佳答案

awk 一行代码:

awk '{printf("%s", /^L/ ? (p?RS:"") $0:substr($0, index($0,";")+1 ));p=1}END{print ""}' infile

或(冗长)

awk '/^L/{ if(p)print ""; printf("%s",$0);next}{ printf("%s",substr($0,index($0,";")+1));p=1}END{print ""}' infile

更好的可读性:

awk '/^L/{ 
           if(p)print ""; 
           printf("%s",$0);
           next
         }
         { 
           printf("%s",substr($0,index($0,";")+1));
           p=1
         }
      END{
           print ""
         }
    ' infile

输入:

$ cat infile
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;

输出:

$ awk '{printf("%s", /^L/ ? (p?RS:"") $0:substr($0, index($0,";")+1 ));p=1}END{print ""}' infile
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;

关于mysql - 将带有子线的行转换为单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46599602/

相关文章:

linux - Bash 脚本 - Grep/Awk 输出作为另一个脚本的输入

MySQL 多行,对多个值进行分组

mysql - 使用MySQL workbench为rails app创建表和数据

mysql - mysql中添加两个或多个时间数据值

linux - 如何在 i3wm 中启动 viber?

linux - 环境变量未全局设置

linux - 搜索一个字符串,得到结果后剪切该单词并将结果存储在变量中

MySQL - 具有一个变量更改的 SAME 查询花费的时间超过 10 倍

linux - 我可以截取 Linux 中 HDMI 输出上显示的内容吗?

linux - 使用 ls 和 grep 而不是 find 搜索目录和子目录以查找与字符串匹配的文件并列出路径