从unix中的文件中读取记录集

时间:2014-03-28 06:09:03

标签: shell unix

我正在尝试构建一个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个。

如果需要,我可以提供更多输入。 我非常感谢你的回复。

2 个答案:

答案 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的值。

要在同一次运行中查找degree1degree2部分,只需要进行少量更改:

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