我有一个包含大量SQL查询的文本文件。我需要在一行上显示每个查询。 查询由 2 个换行符分隔,例如/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 '//{printf "%s",$0;next} {printf "%s ",$0}' report41.txt
我发现了这种模式...
https://regex101.com/r/qNQRk5/4
但是有两个问题。 1(我不知道如何在AWK中使用它,并且2(查询不包含空格。
更新表内
应该是:
更新表 A 内部
使用段落模式:
$ awk -v RS= -v ORS='nn' '{$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='nn'
将输出记录分隔符设置为两个换行符,请注意,这意味着输出末尾将有一个空行{$1=$1}
重建记录内容,默认情况下空格/制表符/换行符将被视为输入字段分隔符- 输出字段分隔符不会更改,因此它在字段之间使用默认的单个空格
- 打印输入记录内容的惯用
1
方法
要保留间距并仅将换行符转换为空格:
$ printf ' atttbn cnn1 2 3' | awk -v RS= -v ORS='nn' '{$1=$1} 1'
a b c
1 2 3
$ printf ' atttbn cnn1 2 3' | awk -v FS='n' -v RS= -v ORS='nn' '{$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.