열별로 디렉터리의 모든 csv 파일을 병합합니다.

열별로 디렉터리의 모든 csv 파일을 병합합니다.

디렉터리에 3개의 csv 파일이 포함되어 있다고 가정합니다.

첫 번째 CSV:

Name, John
Age, 18

두 번째 CSV:

Name, Jim
Age, 21

세 번째 CSV:

Name, Amy
Age, 22

나는 결과가 다음과 같기를 원합니다:

Name, John, Jim, Amy
Age, 18, 21, 22

디렉토리에 n개의 csv가 있을 수 있다는 것을 아는 것이 중요합니다. bash 및 posix 쉘을 사용할 수 있습니다.

편집하다:

이것이 작동할 것 같지만 여전히 순서에 문제가 있습니다.

awk -F, -v OFS="," '{a[FNR]=a[FNR]?a[FNR]FS$2:$1FS$2}END{for(x in a)print x,a[x]}' *.csv > results.csv

FNR 1이 배열의 첫 번째여야 하지만 마지막에 인쇄되므로 이는 의미가 없습니다.

답변1

당신의 시도는 매우 가깝습니다. 필요에 따라 작동하도록 몇 가지 수정 사항은 다음과 같습니다.

awk -F, -v OFS="," '{
        a[FNR] = (FNR==NR ? $0 : a[FNR] OFS $2)
    }
    END { 
        for(i=1;i<=FNR;i++) print a[i]
    }' *.csv

for (x in a)배열 액세스 순서는 보장되지 않으므로 순서를 유지하기 위해 루프를 통해 숫자 인덱싱을 실행합니다 for. 을 사용할 수도 있지만 for (i=1;i<=length(a);i++)배열을 인수로 전달하는 것이 length()모든 awks에서 표준이 아니라는 점을 아는 것이 좋습니다.GNU awk 매뉴얼.

또한보십시오:스캔 배열

또한 "첫 번째 파일을 구문 분석할 때"라는 관용구인 조건문을 사용 FNR==NR하고 전체 줄을 저장하려고 합니다. $0다음 파일에 대해서는 두 번째 필드만 추가합니다.

답변2

데이터가 전치된 테이블 형식("xtab")인 것처럼 보이지만 키-값 쌍의 구분 기호가 탭이 아닌 쉼표이고 너무 많은 공백이 추가되었습니다.

데이터를 정리하고 이를 CSV로 변환하기 위해 Miller( mlr)를 사용할 수 있습니다.

$ mlr --ixtab --ips , --ocsv clean-whitespace fileA fileB fileC
Name,Age
John,18
Jim,21
Amy,22

--ips키와 값 사이에 사용되는 구분 기호인 "쌍 구분 기호"를 설정합니다 .

datamash필드에 쉼표나 개행 문자가 포함되어 있지 않다고 가정하면 GNU를 사용하여 바꾸는 것이 가장 쉽습니다.

$ mlr --ixtab --ips , --ocsv clean-whitespace fileA fileB fileC | datamash -t, transpose
Name,John,Jim,Amy
Age,18,21,22

입력 필드에 쉼표가 포함된 경우 다른 출력 필드 구분 기호(데이터에 표시되지 않는 구분 기호)를 지정한 다음 datamash사용하도록 지시할 수 있습니다.

$ mlr --ixtab --ips , --ocsv --ofs pipe clean-whitespace fileA fileB fileC | datamash -t '|' transpose
Name|John, the dapper|Jim, the mighty|Amy, the awesome
Age|18|21|22

관련 정보