Bash

合併帶有條件的 csv 文件

  • July 14, 2015

每個日期我有 2 個CSV文件(csv_2014_4_15csv_2014_4_16),基本結構和幾個獨特的列如下。

id,name,created_at,updated_at,other columns

12, joe, 2013-1-1 18:30, 2014-2-1 12:00
56, bob, datetime, datetime

我想根據這些條件合併 2 個 csv 文件。到目前為止,我的程式碼如下。

if (csv_date_x.id == csv_date_x+1.id)
{
  if(csv_date_x.updated_at < csv_date_x.updated_at)
        add csv_date_x+1 row into out.csv
}
else {
  if(csv_date_x+1.created_at == TODAY (yyyy-mm-dd)
        add csv_date_x+1 row into out.csv
}

試試這個:

$ awk -F',' -v t="$(date +"%Y-%-m-%-d")" '
   FNR == NR {
       u[$1] = $4;
       next;
   }
   $4 > u[$1] {
       print;
       next;
   }
   t ~ $3
' file_1 file_2

解釋

  • 我們得到今天的日期,將其保存在變數中t

  • 在讀取 file_1FNR == NR時,我們將每個 id 的每次更新時間保存在關聯數組u中,key 為 id,value 為更新時間。

  • 讀取 file_2 時:

    • 如果 id 的更新日期$4大於對應的 id 更新時間保存在數組u( $4 > u[$1]) 中,我們列印該行並跳到下一行。
    • 如果上述條件為假,我們檢查目前行的創建日期是否為今天t ~ $3,即"2014-7-11" ~ "2014-7-11 12:00"如果為真則列印該行。

引用自:https://unix.stackexchange.com/questions/143982