awkを使用して2つのcsvファイルを比較し、値を追加します。

awkを使用して2つのcsvファイルを比較し、値を追加します。

次の 2 つのファイルがあります。 ファイル1.csv

+------------+----------+--------+---------+
| Account_ID | Asset_ID | LOT_ID | FLAG_F1 |
+------------+----------+--------+---------+
|      10000 |    20000 |  30000 | Y       |
|      10001 |    20001 |  30001 | N       |
|      10002 |    20002 |  30002 | Y       |
|      10003 |    20003 |  30003 | N       |
|      10004 |    20004 |  30004 | Y       |
|      10005 |    20005 |  30005 | N       |
|      10006 |    20006 |  30006 | Y       |
+------------+----------+--------+---------+

ファイル2.csv

   +------------+----------+--------+---------+-----+-----+
| Account_ID | Asset_ID | LOT_ID | FLAG_F2 | XYZ | ABC |
+------------+----------+--------+---------+-----+-----+
|      10000 |    20000 |  30000 | Y       | XYZ | ABC |
|      10001 |    20001 |  30001 | Y       | XYZ | ABC |
|      10002 |    20002 |  30002 | Y       | XYZ | ABC |
|      10003 |    20003 |  30003 | Y       | XYZ | ABC |
|      10004 |    20004 |  30004 | Y       | XYZ | ABC |
|      10005 |    20005 |  30005 | Y       | XYZ | ABC |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC |
+------------+----------+--------+---------+-----+-----+

私は次のことを取得しようとしています出力:

    +------------+----------+--------+---------+-----+-----+---------+
| Account_ID | Asset_ID | LOT_ID | FLAG_F2 | XYZ | ABC | FLAG_F1 |
+------------+----------+--------+---------+-----+-----+---------+
|      10000 |    20000 |  30000 | Y       | XYZ | ABC | Y       |
|      10001 |    20001 |  30001 | Y       | XYZ | ABC | N       |
|      10002 |    20002 |  30002 | Y       | XYZ | ABC | Y       |
|      10003 |    20003 |  30003 | Y       | XYZ | ABC | N       |
|      10004 |    20004 |  30004 | Y       | XYZ | ABC | Y       |
|      10005 |    20005 |  30005 | Y       | XYZ | ABC | N       |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC | Y       |
|      10006 |    20006 |  30006 | Y       | XYZ | ABC | Y       |
|      10007 |    20007 |  30006 | Y       | XYZ | ABC |         |
|      10006 |    20003 |  30006 | Y       | XYZ | ABC |         |
+------------+----------+--------+---------+-----+-----+---------+

上記FLAG_F1の出力の条件file1.csvとの値にを追加しました。条件が失敗した場合は空になる可能性があります。file2.csvAccount_ID,Asset_ID,LOT_IDfile1.csvfile2.csv

awkを使って次のコードを試しました。awkを使用して2つの.csvファイルを比較する

awk -F',' '
    FNR == NR {
        if (FNR == 1) {next}
        a[$1] = $2;
        b[$1] = $3;
        next;
    }
    {
        if (FNR == 1) {print;next}
        if (a[$1] == $2) {
            print $1,$2,$3,b[$1];
        }
        else {
            print $1,a[$1],b[$1],b[$1];
        }
    }
  ' OFS=',' file1.csv file2.csv

誰かが私に上記のコードを1行ずつ説明することができれば、より良いでしょう。

ベストアンサー1

これはリンクされた質問よりはるかに簡単です。必要なものは次のとおりです。

awk -F, -v OFS=, 'NR==FNR{a[$1$2$3]=$4; next}{print $0,a[$1$2$3]}' file1 file2

説明する

  • -F,:入力フィールド区切り文字をコンマに設定します。
  • -v OFS=,:出力フィールド区切り文字をコンマに設定します。デフォルトでは、これはカンマ区切りの出力を印刷するのに役立ちます。
  • NR==FNR:NRは現在の行番号、FNRは現在のファイルの行番号です。最初のファイルを読み取る場合のみ、両方とも同じです。
  • a[$1$2$3]=$4; next:これが最初のファイルの場合(上記を参照)、キーが関連付けられている最初、2番目、および3番目のフィールドである配列に4番目のフィールドを保存します。
  • print $0,a[$1$2$3]:現在の行()と最初の3つのフィールドに関連付けられた配列$0の値を印刷します。a最初のファイルに対応する4番目のフィールドです。

おすすめ記事