awk/for/grepを使用した2つのファイルの比較

awk/for/grepを使用した2つのファイルの比較

内容が次の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.csvimpo1.csvexpo1.csvp2_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.csvgrep更新する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

関連情報