我正在尝试构建一个unix shell脚本,并且非常困难。
我的输入文件有多个查询,在相应的标题下显示为: - 输入文件名: - query.txt
degree1 <------ heading(to be searched through out the file)
Select * from t1 <---- Start of Query(Start point of copy)
go <------- End of query(End point of copy)
degree2
select * from t2
go
degree1
select * from t3
go
degree3
select * from t4
go
现在,我应该获取标题“degree1”下的查询,并将其存储在一个单独的文件中。
基本上我需要做以下事情: -
i) write a loop that traverses through the file searching for all "degree1" & "degree2"
ii) after doing that, copy all present under degree1 till "go" keyword into another
file.
iii) create multiple files if there exists more then one occurence of "degree1" in the
query.txt file.
所以根据上面的例子,我应该得到4个不同的文件,即2个包含在degree1下的sql查询,1个用于degree2,另一个用于3个。
如果需要,我可以提供更多输入。 我非常感谢你的回复。
答案 0 :(得分:0)
查找每个degree1
部分并将其写入单独的文件(文件名为output-#
,其中#
从1开始,并针对找到的每个部分递增):
awk 'BEGIN {RS="";FS="\n"} /^degree1\n/ {c++; print $0 >"output-" c}' query.txt
在示例query.txt
文件中,每个部分用空行分隔。由于awk
的记录分隔符设置为空字符串RS=""
,awk
将一次读取完整的部分。如果然后检查该部分是否以degree1
开头。如果是,则会递增计数器c
,并将该部分写入名为output-#
的文件,其中#
将替换为计数器c
的值。
要在同一次运行中查找degree1
和degree2
部分,只需要进行少量更改:
awk 'BEGIN {RS="";FS="\n"} $1=="degree1" {c1++; print $0 >$1 "-" c1} $1=="degree2" {c2++; print $0 >$1 "-" c2}' query.txt
这会创建与每个部分的出现次数相同的文件。
答案 1 :(得分:0)
使用awk
非常简单。
awk -v RS= -v ORS='\n\n' '{print $0 > $1".txt"}' query.txt
这将根据您的示例输入创建3个名为degree1.txt,degree2.txt和degree3.txt的文件。
$ head degree*
==> degree1.txt <==
degree1
Select * from t1
go
degree1
select * from t3
go
==> degree2.txt <==
degree2
select * from t2
go
==> degree3.txt <==
degree3
select * from t4
go