別のCSVに基づいてファイルから行を抽出する

別のCSVに基づいてファイルから行を抽出する

var.txt2つのファイルがありますres.dat

はいvar.txt

date,request,sales,item
20171015,1,123456,216
20171015,1,123456,217
20171015,2,123456,214
20171015,2,345678,213
20171015,2,345678,214
20171015,3,456789,218
20171015,3,345678,217
20171015,4,567890,212

はいres.dat

RTCCVB01                213456                   123456                216
.
.
.
VBPCVB01
RTCCVB01                213456                   345678                214
.
.
.
VBPCVB01
RTCCVB01                213456                   123456                214
.
.
.
VBPCVB01
RTCCVB01                213456                   345678                213
.
.
.
VBPCVB01
RTCCVB01                213456                   123456                217
.
.
.
VBPCVB01
RTCCVB01                213456                   345678                217
.
.
.
VBPCVB01
RTCCVB01                213456                   456789                218
.
.
.
VBPCVB01
RTCCVB01                213456                   567890                212
.
.
.
VBPCVB01

指定された要求番号(の2番目のフィールド)に対して、var.txt販売番号(3番目の列、場所50-56)とアイテム番号(4番目の列、場所72-79)を一致させて、そのRTCCVB01行を見つけてres.datすべて抽出する必要があります。そこからの行VBPCVB01

たとえば、要求番号がある場合は、次の行が1適用されますvar.txt

20171015,1,123456,216
20171015,1,123456,217

res.dat123456したがって、販売番号と品目番号、216または次の項目の項目が必要です217

RTCCVB01                213456                   123456                216
.
.
.
VBPCVB01
RTCCVB01                213456                   123456                217
.
.
.
VBPCVB01

リクエスト2の場合は次のようになります。

RTCCVB01                213456                   123456                214
.
.
.
VBPCVB01
RTCCVB01                213456                   345678                213
.
.
.
VBPCVB01
RTCCVB01                213456                   345678                214
.
.
.
VBPCVB01

要件3:

RTCCVB01                213456                   456789                218
.
.
.
VBPCVB01
RTCCVB01                213456                   345678                217
.
.
.
VBPCVB01

要件4:

RTCCVB01                213456                   567890                212
.
.
.
VBPCVB01

1.datこの場合は、各結果を別々のファイルに保存する必要があります。全体を処理し、4.dat各固有の要求番号var.txtから行を抽出し、datファイルを生成するにはどうすればよいですか?res.dat

答え1

VBPCVB01res.datを解析し、var.txtの販売+アイテムの組み合わせから要求に応じてファイルを閉じるまで、各セクションを作成するスクリプトが必要です。このスクリプトは次のとおりですscript.sh

sed "
/RTCCVB01.*123456.*216/,/VBPCVB01/w 1.dat
/RTCCVB01.*123456.*217/,/VBPCVB01/w 1.dat
/RTCCVB01.*123456.*214/,/VBPCVB01/w 2.dat
/RTCCVB01.*345678.*213/,/VBPCVB01/w 2.dat
/RTCCVB01.*345678.*214/,/VBPCVB01/w 2.dat
/RTCCVB01.*456789.*218/,/VBPCVB01/w 3.dat
/RTCCVB01.*345678.*217/,/VBPCVB01/w 3.dat
/RTCCVB01.*567890.*212/,/VBPCVB01/w 4.dat
d;" res.dat

このスクリプトは私が書いたものではなく、自分で書いたものですsed

sed -E 's/date.*/sed "/;s_.*,(.*),(.*),(.*)_/RTCCVB01.*\2.*\3/,/VBPCVB01/w \1.dat_;${h;s/.*/d;" res.dat/;x;G}' var.txt > script.sh

このスクリプトは、次のように呼び出すことができるsedスクリプトで書かれています。script.sh

/bin/sh script.sh

そしてしなければなりません

関連情報