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

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

2つのcsvファイルがあり、その内容は次のとおりです。

expo1.csv:

102,素晴らしい,形容詞,ENG,p1_0,いいえ,p2_1,いいえ,p3,いいえ,4,はい,p5_2,いいえ,p6,はい....,su1,amb,su_09,いいえ

104、BHAAG、動詞、HIN、p1、はい、p2、いいえ、p3_7、amb、p4、いいえ、p5、いいえ、p6_9、はい....、sg4_3、はい、su119、amb

110,.......,su11_0,午前

そして impo1.csv

104,p1,no
102,p2,yes
104,p10,no
110,su11,no

基本的に はexpo1.csvサーバー上のファイルであり、impo1.csvを更新するために作成したファイルですexpo1.csv。スクリプトは、 impo1 データにわずかな処理を実行した後、expo1.csvで指定されたとおりに変更を加えますimpo1.csv(例: の 102、p2、yes 行が処理され、次に-impo1.csvが更新されます)。expo1.csvp2_1,yes

expo1.csv変更後:

102,素晴らしい,形容詞,ENG,p1_0,いいえ,p2_1,はい,p3,いいえ,4,はい,p5_2,いいえ,p6,はい....,su1,amb,su_09,いいえ

104、BHAAG、動詞、HIN、p1、いいえ、p2、いいえ、p3_7、amb、p4、いいえ、p5、いいえ、p6_9、はい....、sg4_3、はい、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 件の更新が含まれています。 とすると、ファイルに多くの「no」文字列があるため、当然正しい結果は返されません。 for ループを使用してデータを別々の変数に分割し、ワイルドカードを使用して grep をgrep p1 expo1.csv|grep no expo1.csv実行しようとしましたが、うまくいきませんでした。awkgrep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv

GNU bash 4.1.2 を使用します。

編集 - 先に言及すべきでした。私のミスです。impo1.csv ファイルには、expo1 ファイルを確認するために使用できる明確なパターンがありません。私の主張を説明するために、サンプル ファイルの内容を修正しました。

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

関連情報