조건에 따라 CSV 파일 병합

조건에 따라 CSV 파일 병합

나는 2개를 가지고 있다CSV날짜별 파일(csv_2014_4_15그리고csv_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
}

답변1

이 시도:

$ 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_1을 읽을 때 FNR == NR각 ID의 각 업데이트 시간을 연관 배열에 저장합니다 u. 여기서 키는 ID이고 값은 업데이트 시간입니다.
  • file_2를 읽을 때:

    • id의 업데이트 날짜가 $4배열 u( ) $4 > u[$1]에 저장된 해당 id의 업데이트 시간 보다 크면 해당 행을 인쇄하고 다음 행으로 점프합니다.
    • 위 조건이 거짓이면 현재 행의 생성 날짜가 오늘인지 확인합니다. t ~ $3"2014-7-11" ~ "2014-7-11 12:00", 참이면 행을 인쇄합니다.

답변2

csv_date_x는 csv_2014_4_15를 의미하고 csv_date_x+1은 csv_2014_4_16을 의미한다고 가정합니다. 그러나 의사코드에 따르면 csv_date_x의 어떤 행도 사용하지 않으므로 이는 병합이라기보다는 필터에 가깝고 결국 csv_2014_4_16의 하위 집합이 됩니다.

이것은 결코 사소하지 않은 프로그래밍 작업이지만 수익성 있는 방향을 알려드릴 수 있습니다.

처음 두 필드에서 이스케이프된 쉼표를 처리해야 하는 경우 이런 종류의 작업이 까다로울 수 있습니다. 나는 당신이하지 가정합니다.

나는 또한 당신이 그것을 지정하지 않았기 때문에 두 파일을 한 줄씩 비교할 수 있다고 가정합니다.

월과 일이 항상 두 자리(선행 0)가 되도록 먼저 csv 파일을 정규화해야 합니다. 그런 다음 다음과 같이 텍스트로 비교할 수 있습니다 awk.

sed 's/-\([1-9]\)/-0\1/'

(이것은 이름, ID 또는 "기타 열"에 하이픈이 없다고 가정합니다. 그렇다면 날짜 패턴을 더 신중하게 일치시키고 세 번째 및 네 번째 필드로 제한하는 다른 접근 방식이 필요합니다.)

date프로그램을 사용하여 필드와 일치하는 출력 형식으로 오늘 날짜를 생성하고 이를 사용할 변수로 전달합니다 awk.

awk -v Today=$(date +"%Y-%m-%d %H:%M") -v File1=csv_2014_4_15 -v File2=csv_2014_4_16 '
{ getline line1 < File1;
  getline line2 < File2;
  split(line1, f1, ",");
  split(line2, f2, ",");
}
f1[1] == f2[1] { ...; next } # compare IDs this is your first 'if' clause
{ ... } # this is your else clause since the previous ended with "next"

그때 너 정말 건강했구나. f1에는 파일 1의 라인에 대한 필드가 포함되고, f2에는 파일 2의 라인에 대한 필드가 포함됩니다. ID(예: f1[1] 및 f2[1])와 날짜(예: 생성의 경우 f1[2], 업데이트의 경우 f1[3])를 비교할 수 있습니다. 원하는 줄을 인쇄하십시오. Today오늘 날짜와 비교할 수 있습니다 .

awk세 번째와 네 번째 필드를 분할하고 날짜 형식을 정규화하면 더 예뻐질 수 있지만 먼저 살펴 -보는 것이 sed더 쉽습니다.

또한 오늘에는 날짜와 시간이 포함되어 있습니다. 날짜만 비교하려는 경우 date명령 사양에서 이를 제거할 수 있지만 비교하기 전에 csv 필드를 분할하여 시간을 제거해야 합니다.

관련 정보