如何比较2个文件并提取信息

时间:2017-05-01 08:28:17

标签: shell unix

我有两个文件,一个是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文件

2 个答案:

答案 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