将带有子线的线转换为单线

时间:2017-10-06 06:31:46

标签: 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数据库的所有提示,请注意:)

5 个答案:

答案 0 :(得分:0)

要保存:

awk '{printf("%s%s",NR==1 && $0 ~ /^L;/?"":($0 ~ /^L;/?RS:""),$0)} END{print ""}'  Input_file

输出如下。

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

说明: 也可以添加解释和非单一形式的解决方案。

awk '{
printf("%s%s",NR==1 && $0 ~ /^L;/?"":($0 ~ /^L;/?RS:""),$0) ##Using printf here to print the lines. %s%s to print the lines, So while printing them mentioning 2 conditions here NR==1(where it checks if line is very first line of Input_file and line starts from L; then print NULL else if a line starts from L; then print RS(whose default value is new line) else print NULL value. For second string simple print current line.
}                                                           ##So idea behind this logic is simple to print a new line which starts from L; apart from first line, so that we could get output as per OP.
END{
print ""                                                    ##In the END block to print a new line simple printing NULL so that a new line will be inserted.
}
' Input_file                                                ##Mentioning the Input_file here.

答案 1 :(得分:0)

这是sed解决方案,

sed ':a;/O;3/!{N;s/\n//;ba}' file

简要说明,

  • 目标是删除所有' \ n'除了该行以" O; 3"。
  • 开头
  • :a:设置标签' a'在脚本的开头
  • /O;3/!{N;s/\n//;ba}:如果行不以" O; 3"开头,请附加下一行并删除' \ n'同样。然后我们回到标签' a'处理以下行。

答案 2 :(得分:0)

awk单行:

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

OR(冗长)

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;

答案 3 :(得分:0)

Awk 解决方案:

awk -v ORS= 'NR>1 && /^L/{print "\n"}/^T/{sub(/.;/,";")}END{ print "\n" }1' file

输出:

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

答案 4 :(得分:0)

你也可以尝试这个

while read l;do [ "${l%%;*}" = 'L' ]&&{ [ $n ] &&echo "${n%;}";n="$l";}||n="$n${l#*;};";done<infile;echo "${n%;}"