内容が次の2つのCSVファイルがあります。
expo1.csv
:
102, great, 形容詞, ENG, p1_0, no, p2_1, no, p3, no, 4, yes, p5_2, no, p6, yes..., su1, amb, su_09, no
104. BHAAG, verb, HIN, p1, yes, p2, no, p3_7, amb, p4, no, p5, no, p6_9, yes..., sg4_3, yes, su119, amb
110,.......,su11_0,amb
そして
impo1.csv
:
104,p1,no
102,p2,yes
104,p10,no
110,su11,no
デフォルトでは、expo1.csv
サーバー上のファイルとimpo1.csv
更新用に作成されたファイルですexpo1.csv
。 impo1データに対してマイナーな処理を実行した後、スクリプトは指定されexpo1.csv
た内容を変更します(たとえば、行102、p2、yesを処理してから-を更新します)。impo1.csv
impo1.csv
expo1.csv
p2_1,yes
expo1.csv
変更後:
102, great, 形容詞, ENG, p1_0, no, p2_1, yes, p3, no, 4, yes, p5_2, no, p6, yes..., su1, amb, su_09, no
104. BHAAG, verb, HIN, p1, no, p2, no, p3_7, amb, p4, no, p5, no, p6_9, yes..., sg4_3, yes, su119, amb
110,..........,su11_0,いいえ
スクリプトが変更を実行した後、impo1ファイルとexpo1ファイルを比較して、変更が正しく行われたことを確認する必要があります。これが私が付いているところです。
これまで、以下を使用してコンマ間のデータをimpo1.csv
個別に変数に分割できますawk
。
Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no
今問題は、これをどのように確認するかです。これらのimpo1.csv
ファイルには約3000のアップデートが含まれています。 I の場合、grep p1 expo1.csv|grep no expo1.csv
ファイルに文字列 "no" が多いため、正しい結果は返されません。 forループを使用してデータをawk
別の変数に分割し、ワイルドカードを使用してgrepを試しましたが、うまくいきませgrep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv
んでした。
GNU bashの使用4.1.2。
編集 - これは前述のはずでしたが、悪いことは、expo1ファイルをスキャンするために使用できるimpo1.csvファイルに明示的なパターンがないことです。私のポイントを説明するために、サンプルファイルの内容を修正しました。
答え1
解決策はとても簡単です。各行でスキーマを作成しimpo1.csv
てgrep
更新するexpo1.csv
だけです。
validate() {
# $1 ~ impo1.csv
# $2 ~ expo1.csv after changes
while read pattern; do
grep -q "^$pattern" $2 || return 1
done < <(sed "s/,/,.*/" $1 )
}
答え2
awk -F, '
NR==FNR{
for(i=1;i<NF;i)
DATA[$1 SUBSEP $++i] = $++i;
next
}
DATA[$1 SUBSEP $2] != $3
' expo1.csv impo1.csv
impo1.csv
データとは異なる行を印刷しますexpo1.csv