디렉터리에 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