2つのcsvファイルは、3番目のファイルで入力された列ごとのデータ比較を実行します。

2つのcsvファイルは、3番目のファイルで入力された列ごとのデータ比較を実行します。

3つのファイルがあります。

file1 には次のデータがあります。

A,B,C,D,E,F,G
1,2,3,4,5,6,7
7,6,5,4,3,2,1

file2 には次のデータがあります。

A,B,C,D,E,F,G
1,2,3,4,5,5,7
7,6,6,4,3,2,1

file3 には A というフィールドが 1 つしかありません。

A
1
2
7

ここで、file3で使用できる列Aのfile1とfile2を比較したいと思います。

列ヘッダーと列数は両方のファイルで同じです。

希望の出力

Item  FILE1   FILE2
1     F=6     F=5
7     C=5     C=6

より多くの列が一致しない場合

   A,B,C,D,E,F,G
   1,2,3,4,5,5,7
   7,6,5,2,3,2,1

   A,B,C,D,E,F,G
   1,2,3,1,4,6,7
   7,6,6,4,3,2,1

その後、出力は次のようになります

Item    FILE1   FILE2
1       D=4     D=1
        E=5     E=4
        F=5     F=6
7       C=5     C=6
        D=2     D=4

これは例です。列数は変更できますが、File1とFile2では常に同じです。したがって、以前の質問とは異なります。

答え1

#!/bin/bash

join -t, file_1 file_2 | join -t, - file_3 |
awk -F, '
NR == 1 {
    fields_num = (NF + 1) / 2

    for(i = 1; i <= fields_num; i++)
        field_names[i] = $i
}
NR != 1 {
    item = $1 "\t"

    for(i = 2; i <= fields_num; i++) {
        cmp_num = i + fields_num - 1

        if($i != $cmp_num) {
            printf "%s%s=%s\t%s=%s\n",
                    item,
                    field_names[i], $i,
                    field_names[i], $cmp_num

            item = "\t"
        }

    }
}'

いくつかの仮定をしました。

  1. 比較に使用される列は常に最初です。
  2. すべてのファイルは、A最初の列(フィールド)に基づいてソートされます。
  3. file_12つのファイル(and)に表示される項目のみを比較してください。file_2したがって、file_1項目がありますが、存在しない場合、2そのfile_2行は比較から除外されます。

入力する

tail -n +1 -- file_*

==> file_1 <==
A,B,C,D,E,F,G
1,2,3,4,5,5,7
7,6,5,2,3,2,1

==> file_2 <==
A,B,C,D,E,F,G
1,2,3,1,4,6,7
7,6,6,4,3,2,1

==> file_3 <==
A
1
2
7

出力

1   D=4 D=1
    E=5 E=4
    F=5 F=6
7   C=5 C=6
    D=2 D=4

関連情報