두 개의 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.csv
error.csv
행이 성공적으로 로드되면 성공 파일의 첫 번째 열로 "ID"가 표시되고 "메시지" 열은 표시되지 않습니다.
실패하면 항상 파일의 마지막 필드인 "메시지" 필드에 오류가 발생합니다. 이 경우 "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