열 헤더로 두 개의 csv 파일 병합

열 헤더로 두 개의 csv 파일 병합

두 개의 CSV 파일이 있습니다.

성공.csv

"ID", "기존 ID", "필드 1", "필드 2"

1,1111,google,news
2,2222,yahoo,news

오류.csv

"기존 ID", "필드 1", "필드 2", "메시지"

3333,aol,news,"Failed to upload data"    
4444,cbs,news,"Alredy exists"

이 두 파일을 병합하고 아래와 같이 새 파일을 만들려면 어떻게 해야 합니까? 필드의 크기와 순서가 계속 바뀌기 때문에 인덱스를 사용할 수 없습니다.

결과.csv

"ID", "기존 ID", "메시지"

1,1111,""
2,2222,""
"",3333,"Failed to upload data"
"",4444,"Alredy exists"

요구 사항은 sum 에서 3개의 열만 results.csv포함하는 파일을 만드는 것입니다 .success.csverror.csv

  1. 행이 성공적으로 로드되면 성공 파일의 첫 번째 열로 "ID"가 표시되고 "메시지" 열은 표시되지 않습니다.

  2. 실패하면 항상 파일의 마지막 필드인 "메시지" 필드에 오류가 발생합니다. 이 경우 "ID"는 비어 있습니다.

읽은 값은 다음과 같습니다 success.csv.

awk '{print $1, $2;}' success.csv

읽은 값은 다음과 같습니다 error.csv.

awk '{print $1, NF;}' error.csv

이 두 명령문을 결합하여 결과를 파일에 쓰는 방법을 찾을 수 없습니다.

답변1

질문은 명확하지 않지만 다음 구조를 찾고 있다고 생각합니다.

awk 'BEGIN{FS=OFS=","}NR==FNR{print $1,$2,"\"\"";next}{print "\"\"",$1,$NF}' success.csv error.csv

설명하다:

  • 먼저 처음에는 필드 구분 기호( FS)와 출력 필드 구분 기호( OFS)를 다음과 같이 설정했습니다.,
  • 두 파일을 동시에 처리하지만 어느 파일이 처리되는지 확인합니다. 첫 번째는 현재 줄 번호가 NR==FNR현재 파일의 현재 줄 번호와 같을 때 처리됩니다( ).
  • 따라서 첫 번째 파일( success.csv)에 대해서는 을 인쇄 $1,$2,"\"\""하고 두 번째 파일( error.csv)에 대해서는 을 인쇄합니다 "\"\"",$1,$NF.

결과 :

1,1111,""
2,2222,""
"",3333,"Failed to upload data"    
"",4444,"Alredy exists"

답변2

사용밀러( mlr):

$ mlr --csv unsparsify then cut -f ID,'Legacy ID',Message  success.csv error.csv
ID,Legacy ID,Message
1,1111,
2,2222,
,3333,Failed to upload data
,4444,Alredy exists

이는 Miller의 "unsparsify" 작업을 사용하여 사용 가능한 헤더를 기반으로 두 파일의 데이터를 병합하고 파일의 특정 헤더에 대해 존재하지 않는 값으로 빈 문자열을 할당합니다. 그런 다음 "잘라내기" 작업을 수행하여 필드의 하위 집합만 추출합니다.

필드의 순서는 Miller가 필드를 찾는 순서에 따라 달라지므로 파일을 역순으로 제공하면 다른 순서를 얻게 됩니다.

$ mlr --csv unsparsify then cut -f ID,'Legacy ID',Message  error.csv success.csv
Legacy ID,Message,ID
3333,Failed to upload data,
4444,Alredy exists,
1111,,1
2222,,2

"cut" 뒤에 "reorder" 작업을 사용하면 입력 파일의 필드 순서와 관계없이 명시적인 순서로 필드를 다시 정렬할 수 있습니다.

mlr --csv \
    unsparsify then \
    cut -f ID,'Legacy ID',Message then \
    reorder -f ID,'Legacy ID',Message \
    error.csv success.csv

관련 정보