我有两个文件,一个是var.txt,另一个是res.dat文件
var.txt包含如下信息
date,request,sales,item
20171015,1,123456,216
20171015,1,123456,217
20171015,2,345678,214
20171015,3,456789,218
和res.dat包含的是一个包含以下信息的巨大文件
RTCCVB01 213456 123456 216
.
.
.
VBPCVB01
RTCCVB01 213456 345678 214
.
.
.
VBPCVB01
RTCCVB01 213456 123456 217
.
.
.
VBPCVB01
RTCCVB01 213456 456789 218
.
.
.
VBPCVB01
对于唯一请求,我必须创建一个单独的dat文件, 例如 在var.txt中 对于第二列请求 对于请求1,销售额为123456,其中包含2个项目216和217,因此将创建如下所示的dat文件
请求1 - 123456.dat
RTCCVB01 213456 123456 216
.
.
VBPCVB01
RTCCVB01 213456 123456 217
.
.
.
VBPCVB01
请求2 345678.dat
RTCCVB01 213456 345678 214
.
.
.
VBPCVB01
申请3 456789.dat
RTCCVB01 213456 456789 218
.
.
.
VBPCVB01
销售发生在res.dat文件中的50-56位置 项目发生在res.dat文件中的72-79位置
我必须编写一个shell脚本,它将对var.txt中的每个唯一请求执行以下操作,它将从res.dat获取销售和项目以及提取信息,并将创建单独的dat文件,直到完成所有请求编号。< / p>
如果我切割-d,-f3,4 var.txt
输出将是123456 216
123456 217
345678 216
456789 218
我必须使用上面的输出并在res.dat文件中递归搜索,因此根据请求将创建dat文件
答案 0 :(得分:1)
喜欢这个?基于预期的输出,var.dat
似乎是徒劳的。
$ awk 'BEGIN{RS=ORS="VBPCVB01\n"}{f=$3 ".dat"; print >> f; close(f)}' res.dat
$ cat 123456.dat
RTCCVB01 213456 123456 216
.
.
.
VBPCVB01
RTCCVB01 213456 123456 217
.
.
.
VBPCVB01
说明:
awk '
BEGIN { RS=ORS="VBPCVB01\n" } # set the delimiters appropriately
{
f=$3 ".dat" # set $3 as the filename
print >> f # append records to the file
close(f) # close the file (due to "huge file")
} # to avoid running out of fds (unknown unix)
' res.dat # this file only
答案 1 :(得分:1)
短 awk 方法:
awk '/RTCCVB01/{fn=$3}{print > fn".dat"}' res.dat
此命令包含2组花括号:只有在遇到包含模式RTCCVB01
的行时,控件才会转到第一组括号。每一行都会遇到第二组,因为没有条件因此总是如此。
在遇到模式RTCCVB01
时,会创建并存储新的文件名。当第一个RTCCVB01
到来时,fn
将包含123456
,控件将转到下一组括号,并且记录将写入123456.dat
,后续记录将转到文件123456.dat
直到下一个RTCCVB01
到来。
cat 123456.dat
RTCCVB01 213456 123456 216
.
.
.
VBPCVB01
RTCCVB01 213456 123456 217
.
.
.
VBPCVB01
cat 345678.dat
RTCCVB01 213456 345678 214
.
.
.
VBPCVB01
cat 456789.dat
RTCCVB01 213456 456789 218
.
.
.
VBPCVB01