Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用perl/awk连接虚线_Perl_Unix_Join_Sed_Awk - Fatal编程技术网

用perl/awk连接虚线

用perl/awk连接虚线,perl,unix,join,sed,awk,Perl,Unix,Join,Sed,Awk,我有一个包含sql语句的大文件,如: PP3697HB @@@@0 <<<<<<Record has been deleted as per PP3697HB>>>>>> FROM sys.xtab_ref rc,sys.xtab_sys f,sys.domp ur WHE RE rc.milf = ur.milf AND rc.molf = f.molf AND ur.dept = 'SWIT'AND ur .depar

我有一个包含sql语句的大文件,如:

PP3697HB @@@@0
<<<<<<Record has been deleted as per PP3697HB>>>>>>
FROM sys.xtab_ref rc,sys.xtab_sys f,sys.domp ur WHE
RE rc.milf = ur.milf  AND rc.molf = f.molf AND ur.dept = 'SWIT'AND ur
.department = 'IND' AND share = '2' AND ur.status = 'DONE' AND f.s
tatus = 'TRUE' AND rc.OPERATOR = '=' AND rc.VALUE = '261366'AND rc.r
unet IN (SELECT milf FROM sys.domp WHERE change = 'OVO' A
ND IND = 75);
我需要把所有这些断线重新组合成一行

这条线应该是这样的:

PP3697HB @@@@0<<<<<<Record has been deleted as per PP3697HB>>>>>>FROM sys.xtab_ref rc,sys.xtab_sys f,sys.domp ur WHERE rc.milf = ur.milf  AND rc.molf = f.molf AND ur.dept = 'SWIT'AND ur.department = 'IND' AND share = '2' AND ur.status = 'DONE' AND f.status = 'TRUE' AND rc.OPERATOR = '=' AND rc.VALUE = '261366'AND rc.runet IN (SELECT milf FROM sys.domp WHERE change = 'OVO' AND IND = 75);
如何在perl/awk中实现这一点

我们可以说,行的开头必须是^PP.*,sql语句的结尾必须是。*$


如果您理解此问题有困难,请告诉我,我将再次尝试解释。

请尝试使用Perl实现此解决方案:

#!/usr/bin/perl -w    
use strict;
use warnings;
use Data::Dumper;

## The raw string
my $str = "                                                                                                                                                                                                                                  
PP3697HB @@@@0                                                                                                                                                                                                                               
<<<<<<Record has been deleted as per PP3697HB>>>>>>                                                                                                                                                                                          
FROM sys.xtab_ref rc,sys.xtab_sys f,sys.domp ur WHE                                                                                                                                                                                          
RE rc.milf = ur.milf  AND rc.molf = f.molf AND ur.dept = 'SWIT'AND ur                                                                                                                                                                        
.department = 'IND' AND share = '2' AND ur.status = 'DONE' AND f.s                                                                                                                                                                           
tatus = 'TRUE' AND rc.OPERATOR = '=' AND rc.VALUE = '261366'AND rc.r                                                                                                                                                                         
unet IN (SELECT milf FROM sys.domp WHERE change = 'OVO' A                                                                                                                                                                                    
         ND IND = 75);                                                                                                                                                                                                                       
";

## Split the given string as per new line.
my @lines = split(/\n/, $str);

## Join every element of the formed array using blank.
$str = join("", @lines);

print $str;
Perl解决方案:

perl -ne 'chomp $last unless /^PP/; print $last; $last = $_ }{ print $last' FILE.SQL
试试这一行:

awk '!/;$/{printf "%s",$0}/;$/{print}' file
使用tr删除换行符,使用sed拆分每条SQL语句:

tr '\n' ' ' < file | sed 's/;/;\n/g'

假设有其他线没有像这样分开,并且只有指定的线需要重新连接:

awk '
    /^PP/ {insql=1}
    /;$/  {insql=0}
    insql {printf "%s", $0; next}
          {print}
' file