Awk 删除换行符,同时保留换行符后的另一个换行符

Awk 删除换行符,同时保留换行符后的另一个换行符,awk,sed,grep,Awk,Sed,Grep,我有一个包含大量SQL查询的文本文件。我需要将每个查询放在一行上。 查询由两个换行符分隔,例如/n/n,而查询本身可能有一个/n 输入文件: select * from table A where name = 'abc' drop table A; update table a inner join b on a.name = b.name fourth query continue fifth query 预期产出: select * from table A where na

我有一个包含大量SQL查询的文本文件。我需要将每个查询放在一行上。 查询由两个换行符分隔,例如/n/n,而查询本身可能有一个/n

输入文件:

select * from 
table A 
where name = 'abc'

drop table A;

update table a
inner join b on a.name = b.name

fourth query
continue

fifth query
预期产出:

select * from table A where name = 'abc'

drop table A;

update table a inner join b on a.name = b.name

fourth query continue

fifth query
我试过了,但它把所有的东西都打印在一行上

awk'/\n/{printf\n%s\n,$0;next}{printf%s,$0}'report41.txt

我发现了这个模式

但有两个问题。1我不知道如何在AWK中使用它,2查询不包含空格

更新表ainner

应该是:

更新表a内部

使用段落模式:

$ awk -v RS= -v ORS='\n\n' '{$1=$1} 1' ip.txt
select * from table A where name = 'abc'

drop table A;

update table a inner join b on a.name = b.name

fourth query continue

fifth query
-v RS=空RS将基于一个或多个空行拆分输入内容 -v ORS='\n\n'将输出记录分隔符设置为两个换行符,请注意,这意味着输出末尾将有一个空行 {$1=$1}重建记录内容,默认情况下,空格/制表符/换行符将被视为输入字段分隔符 输出字段分隔符未更改,因此在字段之间使用默认的单个空格 1打印输入记录内容的惯用方法 要保留间距并仅将换行符转换为空格,请执行以下操作:

$ printf '   a\t\t\tb\n  c\n\n1  2    3' | awk -v RS= -v ORS='\n\n' '{$1=$1} 1'
a b c

1 2 3

$ printf '   a\t\t\tb\n  c\n\n1  2    3' | awk -v FS='\n' -v RS= -v ORS='\n\n' '{$1=$1} 1'
   a            b   c

1  2    3
使用段落模式:

$ awk -v RS= -v ORS='\n\n' '{$1=$1} 1' ip.txt
select * from table A where name = 'abc'

drop table A;

update table a inner join b on a.name = b.name

fourth query continue

fifth query
-v RS=空RS将基于一个或多个空行拆分输入内容 -v ORS='\n\n'将输出记录分隔符设置为两个换行符,请注意,这意味着输出末尾将有一个空行 {$1=$1}重建记录内容,默认情况下,空格/制表符/换行符将被视为输入字段分隔符 输出字段分隔符未更改,因此在字段之间使用默认的单个空格 1打印输入记录内容的惯用方法 要保留间距并仅将换行符转换为空格,请执行以下操作:

$ printf '   a\t\t\tb\n  c\n\n1  2    3' | awk -v RS= -v ORS='\n\n' '{$1=$1} 1'
a b c

1 2 3

$ printf '   a\t\t\tb\n  c\n\n1  2    3' | awk -v FS='\n' -v RS= -v ORS='\n\n' '{$1=$1} 1'
   a            b   c

1  2    3

你能试试下面的吗

awk '{printf("%s%s",NF && FNR>1 && prev!=""?OFS:FNR>1?ORS:"",$0);prev=$0} END{print ""}'  Input_file
说明:添加上述内容的说明

awk '                                                          ##Starting awk program from here.
{
  printf("%s%s",NF && FNR>1 && prev!=""?OFS:FNR>1?ORS:"",$0)   ##Using printf command here, printing 2 strings. Checking condition if line is greater than 1
  prev=$0                                                      ##AND prev NOT equal to 1 print new line or line is grater than 1 print ORS or NULL, then print line.
}                                                              ##Setting current line value to prev variable here.
END{                                                           ##Starting END block of this code here.
  print ""                                                     ##Printing new line here.
}
'  Input_file                                                  ##Mentioning Input_file name here.

你能试试下面的吗

awk '{printf("%s%s",NF && FNR>1 && prev!=""?OFS:FNR>1?ORS:"",$0);prev=$0} END{print ""}'  Input_file
说明:添加上述内容的说明

awk '                                                          ##Starting awk program from here.
{
  printf("%s%s",NF && FNR>1 && prev!=""?OFS:FNR>1?ORS:"",$0)   ##Using printf command here, printing 2 strings. Checking condition if line is greater than 1
  prev=$0                                                      ##AND prev NOT equal to 1 print new line or line is grater than 1 print ORS or NULL, then print line.
}                                                              ##Setting current line value to prev variable here.
END{                                                           ##Starting END block of this code here.
  print ""                                                     ##Printing new line here.
}
'  Input_file                                                  ##Mentioning Input_file name here.

干净、简单、优雅!然而,有一个问题。当字符串包含双空格或制表符时,它们将转换为单个空格。这可能不是我们想要的。最安全的是awk'BEGIN{RS=;ORS=\n\n;FS=\n}{$1=$1}1'是的,它还将修剪尾随/前导空格。。。对于给定的问题,我猜这不是一个干净、简单和优雅的问题!然而,有一个问题。当字符串包含双空格或制表符时,它们将转换为单个空格。这可能不是我们想要的。最安全的是awk'BEGIN{RS=;ORS=\n\n;FS=\n}{$1=$1}1'是的,它还将修剪尾随/前导空格。。。对于给定的问题,我猜这不是一个问题