행 수가 다른 .csv 파일 병합

행 수가 다른 .csv 파일 병합

여기에도 비슷한 질문을 한 적이 있습니다.

이제 3개의 .csv 파일이 있는데 그 중 하나에는 행이 1개만 있습니다.

파일 1.csv

dog
cats
mouse

파일 2.csv

001a
002a
003c

파일 3.csv

WORD

출력은 다음과 같아야합니다.

dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

솔루션 (이전 질문에서) 예:

paste -d, file1.csv file2.csv | awk -F, '{print $1 "," $2 ",WORD"}'

하지만 "WORD"는 여기에만 쓰여지고 file3.csv에서는 읽혀지지 않습니다.

pastefile3.csv에 각 행을 채우도록 지시하는 방법이 있나요 ? 아니면 file3.csv를 변수로 저장하고 할당할까요 awk?

답변1

또 다른 간단한 방법은 다음과 같습니다.

$ paste  -d, file1 file2 file3 | awk 'BEGIN{FS=OFS=","} {if(NR==1){w=$3} else {$3=w}}1'
dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

답변2

$ paste -d, file1.csv file2.csv |
    awk -v OFS=',' 'NR==FNR{w=$0; next} {print $0, w}' file3.csv -
dog,001a,WORD
cats,002a,WORD
mouse,003c,WORD

답변3

fill-down하위 명령 사용밀러( mlr) 파일 길이에 관계없이 모든 빈 필드를 이전 레코드의 해당 필드 값으로 채울 수 있습니다.

각 파일의 데이터가 헤드리스 CSV라고 가정하고 다음 명령은 각 레코드의 세 필드 모두에 대해 채우기 작업을 수행합니다.

paste -d, file1 file2 file3 | mlr -N --csv fill-down -f 1,2,3

예제 실행(더 짧은 두 번째 파일을 사용하고 있음에 유의하세요):

$ cat file1
dog
cats
mouse
$ cat file2
001a
002a
$ cat file3
WORD
$ paste -d, file1 file2 file3
dog,001a,WORD
cats,002a,
mouse,,
$ paste -d, file1 file2 file3 | mlr -N --csv fill-down -f 1,2,3
dog,001a,WORD
cats,002a,WORD
mouse,002a,WORD

pasteMiller에 대한 TSV 데이터 세트를 생성한 다음(기본값이 아닌 구분 기호를 설정하지 않음) --t2cTSV를 CSV로 변환하는 옵션을 활용하는 변형 입니다( --itsv두 옵션 및 의 조합에 대한 바로가기 --ocsv).

paste file1 file2 file3 | mlr -N --t2c fill-down -f 1,2,3

관련 정보