두 개의 서로 다른 CSV 파일의 두 열을 비교하고 출력을 병합합니다.

두 개의 서로 다른 CSV 파일의 두 열을 비교하고 출력을 병합합니다.

표 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행에서 두 번째와 세 번째 열을 추출합니다.
  • T2:2대체가 이루어지지 않으면 다음으로 점프합니다(따라서 TABLE2.csv행의 경우).
  • 변경된 TABLE2.csv행은 이전 공간에 추가된 Hd삭제됩니다(행 실행 중지).
  • :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을 추가합니다.

열 간격의 형식을 지정하는 것은 사용자의 몫입니다.

관련 정보