2つの異なるCSVファイルの2つの列を比較し、出力をマージします。

2つの異なるCSVファイルの2つの列を比較し、出力をマージします。

表 1.csv

 DATE,      TIMESTAMP, ID,  START TIME, END TIME, DURATION
2019-04-05, 13:57:19,  1607,13:06:42,   13:07:12, 00:00:30
2019-04-05, 13:58:00,  2327,13:57:26,   13:57:43, 00:00:17
2019-04-24, 12:30:00,  1836,11:20:01,   12:30:00, 01:09:59
2019-04-24, 12:30:00,  1836,11:20:01,   12:30:00, 01:09:59
2019-04-24, 15:30:01,  1836,14:50:01,   15:30:01, 00:40:00
2019-04-24, 15:30:01,  1836,14:50:01,   15:30:01, 00:40:00

表 2.csv

KEY, ID,   NAME
407, 1607, RECORD1
1127,2327, RECORD2
636, 1836, RECORD3
664, 1864, RECORD4
703, 1903, RECORD5

次のように、TABLE1.csvの列3とTABLE2.csvの列2を目的の出力と一致させます。

 DATE,      TIMESTAMP, ID,   NAME,    START TIME, END TIME, DURATION
2019-04-05, 13:57:19,  1607, RECORD1, 13:06:42,   13:07:12, 00:00:30
2019-04-05, 13:58:00,  2327, RECORD2, 13:57:26,   13:57:43, 00:00:17
2019-04-24, 12:30:00,  1836, RECORD3, 11:20:01,   12:30:00, 01:09:59
2019-04-24, 12:30:00,  1836, RECORD3, 11:20:01,   12:30:00, 01:09:59
2019-04-24, 15:30:01,  1836, RECORD3, 14:50:01,   15:30:01, 00:40:00
2019-04-24, 15:30:01,  1836, RECORD3, 14:50:01,   15:30:01, 00:40:00

私はすべての例を試しました

awk -F',' 'FNR==NR.....

答え1

このsedコレクションはスペースの置換を保存し、TABLE2.csv列を追加します。

sed 's/^[^,]*, *\([0-9]*,[^,]*\)$/\1/
T2
H;d
:2
G
s/\([^,]*,[^,]*, *\)\([0-9]*,\)\([^[:cntrl:]]*\)\n.*\n\2\([^[:cntrl:]]*\)/\1\2\4, \3/
P;d' TABLE2.csv TABLE1.csv

必要に応じて、変更されたタイトルにいくつかのコンテンツを追加する必要があります。

  • s/^[^,]*, *\([0-9]*,[^,]*\)$/\1/TABLE2.csv行から2番目と3番目の列を抽出します。
  • T2:2置き換えが行われない場合は、次にジャンプします(したがってTABLE2.csv行の場合)。
  • 変更されたTABLE2.csv行は、前のスペースに追加されたH後にd削除されます(行の実行を中止)。
  • :2ジャンプマークです。以下のTABLE1.csv作業はすべて行に対してのみ行われます。
  • G予約済みスペースからパターンスペースとしてルックアップテーブルを追加します。
  • s/\([^,]*,[^,]*, *\)\([0-9]*,\)\([^[:cntrl:]]*\)\n.*\n\2\([^[:cntrl:]]*\)/\1\2\4, \3/ルックアップテーブルでID()エントリを見つけて、一致する[0-9]*,フィールドを追加します。
  • P追加されたルックアップテーブルなしでこの行を印刷し、dこの行の実行を停止します。

詳細な説明は参考にしてくださいあるファイルで定義されたコンテンツを別のファイルに置き換える方法

答え2

私は使用しますそのために

awk -F', *' -v OFS=', ' '
    NR == FNR { name[$2] = $3; next }
    { $3 = $3 OFS name[$3]; print }
' TABLE{2,1}.csv

出力

 DATE, TIMESTAMP, ID, NAME, START TIME, END TIME, DURATION
2019-04-05, 13:57:19, 1607, RECORD1, 13:06:42, 13:07:12, 00:00:30
2019-04-05, 13:58:00, 2327, RECORD2, 13:57:26, 13:57:43, 00:00:17
2019-04-24, 12:30:00, 1836, RECORD3, 11:20:01, 12:30:00, 01:09:59
2019-04-24, 12:30:00, 1836, RECORD3, 11:20:01, 12:30:00, 01:09:59
2019-04-24, 15:30:01, 1836, RECORD3, 14:50:01, 15:30:01, 00:40:00
2019-04-24, 15:30:01, 1836, RECORD3, 14:50:01, 15:30:01, 00:40:00

まず、TABLE2を読み取り、IDをNAMEにマップします。
次に TABLE1 を読み取り、ID フィールドに NAME を追加します。

列間隔の書式設定はユーザーの役割です。

関連情報