나는 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"
, 참이면 행을 인쇄합니다.
- id의 업데이트 날짜가
답변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 필드를 분할하여 시간을 제거해야 합니다.