Regex 使用Sed/Awk在UNIX中合并两行

Regex 使用Sed/Awk在UNIX中合并两行,regex,bash,unix,awk,sed,Regex,Bash,Unix,Awk,Sed,考虑UNIX中具有以下管道分隔行的源文件。这个例子有五行。第1行、第2行和第4行很好,但第3行和第5行由于文本中的换行符而分成两行。我必须将第3行合并为单行,将第5行合并为单行,只删除t处的新行,然后加载到oracle表中 如何使用sed/awk或任何其他UNIX命令实现这一点 输入示例: 期望输出: 通过perl perl -00pe 's/\n(?!\h*\d)//g' file 或 通过perl perl -00pe 's/\n(?!\h*\d)//g' file 或 通过perl p

考虑UNIX中具有以下管道分隔行的源文件。这个例子有五行。第1行、第2行和第4行很好,但第3行和第5行由于文本中的换行符而分成两行。我必须将第3行合并为单行,将第5行合并为单行,只删除t处的新行,然后加载到oracle表中

如何使用sed/awk或任何其他UNIX命令实现这一点

输入示例: 期望输出: 通过perl

perl -00pe 's/\n(?!\h*\d)//g' file

通过perl

perl -00pe 's/\n(?!\h*\d)//g' file

通过perl

perl -00pe 's/\n(?!\h*\d)//g' file

通过perl

perl -00pe 's/\n(?!\h*\d)//g' file


它也可以在awk中完成

awk '{if(!match($0,"[0-9]\\. ")){print prev$0}else{print $0}; prev=$0}' file

它也可以在awk中完成

awk '{if(!match($0,"[0-9]\\. ")){print prev$0}else{print $0}; prev=$0}' file

它也可以在awk中完成

awk '{if(!match($0,"[0-9]\\. ")){print prev$0}else{print $0}; prev=$0}' file

它也可以在awk中完成

awk '{if(!match($0,"[0-9]\\. ")){print prev$0}else{print $0}; prev=$0}' file

似乎每行应该有7个字段:

awk -F'|' '
    {$0 = prev $0} 
    NF < 7 {prev = $0} 
    NF == 7 {print; prev=""}
' file

似乎每行应该有7个字段:

awk -F'|' '
    {$0 = prev $0} 
    NF < 7 {prev = $0} 
    NF == 7 {print; prev=""}
' file

似乎每行应该有7个字段:

awk -F'|' '
    {$0 = prev $0} 
    NF < 7 {prev = $0} 
    NF == 7 {print; prev=""}
' file

似乎每行应该有7个字段:

awk -F'|' '
    {$0 = prev $0} 
    NF < 7 {prev = $0} 
    NF == 7 {print; prev=""}
' file

使用GNU awk进行多字符RS:

$ awk -v RS='^$' -v ORS= '{gsub(/\s*\n\(/,"(")}1' file
 1. 9187-001|COS 60W 16G T1A CLV|||||10
 2. 9184-002|COS 48W 28G NT SKO|FOOTAGE/SEQUENCE GRIDS||||10
 3. 9679-229|COS 56G 40G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10
 4. 9184-230|COS48W 48G NT LIF SKO|LIFE STORE COSMETIC FOOTAGE/SEQUENCE GRID||||10
 5. 9679-230|COS 56G 44G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10

使用GNU awk进行多字符RS:

$ awk -v RS='^$' -v ORS= '{gsub(/\s*\n\(/,"(")}1' file
 1. 9187-001|COS 60W 16G T1A CLV|||||10
 2. 9184-002|COS 48W 28G NT SKO|FOOTAGE/SEQUENCE GRIDS||||10
 3. 9679-229|COS 56G 40G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10
 4. 9184-230|COS48W 48G NT LIF SKO|LIFE STORE COSMETIC FOOTAGE/SEQUENCE GRID||||10
 5. 9679-230|COS 56G 44G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10

使用GNU awk进行多字符RS:

$ awk -v RS='^$' -v ORS= '{gsub(/\s*\n\(/,"(")}1' file
 1. 9187-001|COS 60W 16G T1A CLV|||||10
 2. 9184-002|COS 48W 28G NT SKO|FOOTAGE/SEQUENCE GRIDS||||10
 3. 9679-229|COS 56G 40G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10
 4. 9184-230|COS48W 48G NT LIF SKO|LIFE STORE COSMETIC FOOTAGE/SEQUENCE GRID||||10
 5. 9679-230|COS 56G 44G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10

使用GNU awk进行多字符RS:

$ awk -v RS='^$' -v ORS= '{gsub(/\s*\n\(/,"(")}1' file
 1. 9187-001|COS 60W 16G T1A CLV|||||10
 2. 9184-002|COS 48W 28G NT SKO|FOOTAGE/SEQUENCE GRIDS||||10
 3. 9679-229|COS 56G 40G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10
 4. 9184-230|COS48W 48G NT LIF SKO|LIFE STORE COSMETIC FOOTAGE/SEQUENCE GRID||||10
 5. 9679-230|COS 56G 44G NT SVO|"FOOTAGE/SEQUENCE GRIDS FOR STREETSCAPE STORES(ALL COSMETICS ON 60"" HIGH GONDOLAS"||||10

您不需要仅为了测试匹配而需要匹配,您只需要在以后要使用RSTART/RLENGTH时才需要它。
match()
的第二个参数是一个regexp而不是一个字符串,因此使用regexp分隔符,这样就不需要对任何
match($0,/[0-9]\./)进行双转义了。
。您不需要将
$0
指定为
打印的参数,因为这是默认值。您可以将整个命令简化为
awk'{print(/[0-9]\./?“”:prev)$0;prev=$0}'文件
(但它仍然不会产生所需的输出)。是的,您是对的。它给出了重复的行,所以我会用类似于
awk'{if(!match($0,[0-9]\\.')){printf$0}或者{printf“\n”$0};prev=$0};END{printf“\n”}
,但我必须承认,Glenn Jackmans的解决方案更简单、更优雅。至于您的评论,我想指定默认参数,因为这似乎使代码更清晰,但感谢您在
match()
中提供有关regexp分隔符的信息。永远不要执行
printf$0
,而是始终执行
printf“%s”,0
。想象一下,如果
$0
包含
%s
或其他一些printf格式字符串,会有什么不同。这应该与您指定所有arg的理念非常吻合,而不管它们是否需要。您也不需要那些虚假的分号。感谢您提供有用的评论。您不需要仅为了测试匹配而使用匹配,您只需要在以后使用RSTART/RLENGTH时才需要它。
match()
的第二个参数是一个regexp而不是一个字符串,因此使用regexp分隔符,这样就不需要对任何
match($0,/[0-9]\./)进行双转义了。
。您不需要将
$0
指定为
打印的参数,因为这是默认值。您可以将整个命令简化为
awk'{print(/[0-9]\./?“”:prev)$0;prev=$0}'文件
(但它仍然不会产生所需的输出)。是的,您是对的。它给出了重复的行,所以我会用类似于
awk'{if(!match($0,[0-9]\\.')){printf$0}或者{printf“\n”$0};prev=$0};END{printf“\n”}
,但我必须承认,Glenn Jackmans的解决方案更简单、更优雅。至于您的评论,我想指定默认参数,因为这似乎使代码更清晰,但感谢您在
match()
中提供有关regexp分隔符的信息。永远不要执行
printf$0
,而是始终执行
printf“%s”,0
。想象一下,如果
$0
包含
%s
或其他一些printf格式字符串,会有什么不同。这应该与您指定所有arg的理念非常吻合,而不管它们是否需要。您也不需要那些虚假的分号。感谢您提供有用的评论。您不需要仅为了测试匹配而使用匹配,您只需要在以后使用RSTART/RLENGTH时才需要它。
match()
的第二个参数是一个regexp而不是一个字符串,因此使用regexp分隔符,这样就不需要对任何
match($0,/[0-9]\./)进行双转义了。
。您不需要将
$0
指定为
打印的参数,因为这是默认值。您可以将整个命令简化为
awk'{print(/[0-9]\./?“”:prev)$0;prev=$0}'文件
(但它仍然不会产生所需的输出)。是的,您是对的。它给出了重复的行,所以我会用类似于
awk'{if(!match($0,[0-9]\\.')){printf$0}或者{printf“\n”$0};prev=$0};END{printf“\n”}
,但我必须承认,Glenn Jackmans的解决方案更简单、更优雅。至于您的评论,我想指定默认参数,因为这似乎使代码更清晰,但感谢您在
match()
中提供有关regexp分隔符的信息。永远不要执行
printf$0
,而是始终执行
printf“%s”,0
。想象一下,如果
$0
包含
%s
或其他一些printf格式字符串,会有什么不同。这应该与您指定所有arg的理念非常吻合,而不管它们是否需要。您也不需要那些虚假的分号。感谢您提供有用的评论。您不需要仅为了测试匹配而使用匹配,您只需要在以后使用RSTART/RLENGTH时才需要它。
match()
的第二个参数是一个regexp而不是一个字符串,因此使用regexp分隔符,这样就不需要对任何
match($0,/[0-9]\./)进行双转义了。
。您不需要将
$0
指定为
打印的参数,因为这是默认值。您可以将整个命令简化为
awk'{print(/[0-9]\./?“”:prev)$0;prev=$0}'文件
(但它仍然不会产生所需的输出)。是的,您是对的。它给出了重复的行,所以我会用类似于
awk'{if(!match($0,[0-9]\\.')){printf$0}或者{printf“\n”$0};prev=$0};END{printf“\n”}
,但我必须承认,Glenn Jackmans的解决方案更简单、更优雅。关于你的话,我想