Awk 删除换行符,同时保留换行符后的另一个换行符
我有一个包含大量SQL查询的文本文件。我需要将每个查询放在一行上。 查询由两个换行符分隔,例如/n/n,而查询本身可能有一个/n 输入文件: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
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'是的,它还将修剪尾随/前导空格。。。对于给定的问题,我猜这不是一个问题