하나의 .csv에서 다른 .csv 파일로 열 추가


12

file1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

file2.csv

A,B
A,B
A,B
A,B

원하는 Output.csv

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

"join"과 "paste"를 사용해 보았습니다. 이 작업을 수행하는 bash 명령이 있습니까? "A"열은 두 .csv파일 에서 동일 합니다.


B 열을 파일 1에 복사하도록 요청하고 있습니까? 아니면 C와 D 열을 file2에?
Tim

출력이 "desiredOutput.csv"와 일치하는 한 어느 쪽이든 괜찮을 것입니다
Roboman1723

나는 다른 모든 답변보다 쉬운 새로운 답변을 추가했습니다 (첫 번째 답변 포함). 나중에 참조 할 수 있도록 정보를 쉽게 찾을 수 있도록 허용하는 것이 좋습니다.
don.joey

답변:


11

awk명령 만으로 :

awk -F, '{getline f1 <"file2" ;print f1,$3,$4}' OFS=, file1

file1에서 줄을 가져 와서 로컬 변수에 저장 f1한 다음 저장 한 줄을 f1인쇄하고 마지막 으로 쉼표로 구분 된 file1에서 세 번째 ( $3) 및 앞으로 ( $3) 필드를 인쇄 ,하고 OFS (출력 필드 구분 기호 [space by 기본값])을 쉼표 ( ,)로


짧은 명령은 다음과 같습니다.

paste -d, file2 <(cut -d, -f3- file1)
 A, B, C, D  
 A, B, C, D  
 A, B, C, D  
 A, B, C, D  

file2를 붙여 넣은 다음 세 번째 열을 잘라서 -f3-file1 의 다음 열 ( )에 붙여 넣습니다 .


awkpaste(옵션 A)

아래 명령은 또한 C,Dfile2의 각 줄 끝에있는 file1 의 마지막 두 열 ( )을 복사합니다 .

paste -d',' file2  <(awk -F',' '{print $(NF-1)","$NF}' file1)

위의 명령 은 file2 내용을 붙여 넣은 다음 쉼표 구분 기호 ( -d',') 를 인쇄 한 다음 두 개의 마지막 필드를 붙여 넣습니다 (마지막 필드 NF의 인덱스이며 인덱스 $NF가있는 문자열입니다 NF. $(NF-1)마지막 필드 앞의 두 번째 필드입니다). 또는 쉼표 관전자 ( -F',') 로 분할 합니다.

awkpaste(옵션 B)

또한이 명령은 (상기와 동일 $3하고 $4FILE1의 각 라인의 제 전후 필드 점) :

paste -d',' file2  <(awk -F',' '{print $3","$4}' file1)

또는 cut명령이있는 다른 솔루션 :

paste -d, <(cut -d, -f1 file1) <(cut -d, -f2 file2) <(cut -d, -f3- file1)

절단 된 상기 명령의 명령은 먼저 (최초 필드 절단 -f1콤마 분리 (색인화 -d.FILE1 (행)) cut -d, -f1 file1) 다음, 절단 및 파일 2 (두 번째 필드를 붙여 cut -d, -f2 file2) 마지막으로 잘라내어 (세 번째 열에 붙여 -f3합니다 (nexts에) -) file1 ( cut -d, -f3- file1)에서 다시.

이 명령은 또한 동일한 결과를 반환합니다.

paste -d, <(awk -F',' '{print $1}' file1) <(awk -F',' '{print $2}' file2) <(awk -F',' '{print $3","$4}' file1)

file1 ( awk -F',' '{print $1}' file1) 에서 두 번째 필드를 붙여넣고 쉼표 ( )를 인쇄 한 -d,다음 file2 ( awk -F',' '{print $2}' file2) 에서 두 번째 열을 붙여넣고 마지막으로 file1 ( awk -F',' '{print $3","$4}' file1) 의 두 번째 및 마지막 열을 다시 붙여 넣 습니다.


@kasi 당신은 awk 자체를 통해 이것을 할 수 있습니다. 참조 stackoverflow.com/a/14984673/3297613
Avinash 라즈

9

여기에 아름다움이 있습니다 (생각합니다).

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

단계적으로 분류 :

1 단계. csvkit을 설치합니다 :

sudo pip install csvkit
sudo apt-get install python-dev python-pip python-setuptools build-essential

2 단계. 구분 기호로 쉼표와 함께 join 명령 사용

join -t,

단계 3. 원하는 실제 열을 공급하십시오. 첫 번째 열에 조인이 실제로 수행되는 열이므로 두 번 공급하는 방법에 유의하십시오 (기본 동작은 join).

join -t, <(csvcut --columns 1,3,4 file1.csv) <(csvcut --columns 1,2 file2.csv)

또는 속기 :

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

원하는 경우 표준 출력을 파일 (desiredOutput)로 리디렉션 할 수 있습니다.

장점

이 방법은 제안 된 방법보다 몇 가지 장점이 있습니다.

가장 먼저 : 실제 조인을 수행합니다. 이는 더 복잡한 데이터에도 사용될 수 있음을 의미합니다. 예를 들어 다른 필드에서 조인하는 것은 매우 쉽습니다. 단순히 필드의 위치를 ​​보는 것이 아니라 실제로 열을 고려합니다. 실제로 데이터 형식 (csv)으로 작동하며 텍스트처럼 취급하지 않습니다.

둘째, 매우 강력한 csv 툴킷을 사용하여 a) 하나의 명령으로 통계 표시 ( csvstats), b) 데이터가 깨끗한 지 확인 ( csvclean)하지만 데이터 를 json, sql 또는 심지어로드 할 수 있습니다 파이썬! 이 툴킷은 데이터 준비를 위해 데이터 과학에서 많이 사용됩니다.


Ubuntu에 설치하는 경우 csvkit을 설치하기 전에 Python 개발 헤더를 설치해야 할 수 있습니다. sudo apt-get install python-dev python-pip python-setuptools build-essential- link
karel

멋진 대답도 있습니다. 회사 서버에서 일하고 있기 때문에 물건을 설치하는 데 약 일주일의 서류 작업이 필요합니다. 그래도 내 컴퓨터에서 작동합니다!
Roboman1723

CSV 데이터를위한 다른 도구를 보여 주면 +1입니다. 별도의 질문이지만 CSV 데이터 파일에 대한 독립 실행 형 보고서 작성기를 알고 있습니까?
Joe

@Joe '보고서 작성자'에 대해 말할 때의 의미에 대해 더 구체적으로 설명 할 수 있습니까? 나는 당신이 무슨 뜻인지 이해하지 못합니다.
don.joey


7

여기 또 다른 아름다운 것이 있습니다. 나는 그것이 지금까지 모든 제안 중 가장 쉬운 것이라고 생각합니다.

csvtool pastecol 2 2 file1.csv file2.csv

과거에 csvtool을 아직 설치하지 않은 경우에는 설치해야합니다 sudo apt-get install csvtool.

문서에서 :

pastecol <column-spec1> <column-spec2> input.csv update.csv

input.csv 파일에서 참조하는 열의 내용을 update.csv에 지정된 해당 열 중 하나로 바꿉니다.

예:

  csvtool pastecol 2-3 1- input.csv update.csv.csv > output.csv

우리의 경우 파일의 두 번째 열을 어떻게 대체하는지 주목하십시오.

file1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

file2.csv

A,B
A,B
A,B
A,B

두 파일을 결합 :

csvtool pastecol 2 2 file1.csv file2.csv
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

본질적으로하는 일은 file2.csv2 열을 2 열의 붙여 넣는 것 입니다 file1.csv.

이것은 동일한 문서에서도 작동합니다. 두 개의 열을 바꾸려면 input.csv 및 update.vsc와 동일한 파일을 사용하면됩니다.

csvtool pastecol 2 1 file2.csv file2.csv 
A,A
A,A
A,A 
A,A

의심 할 여지없이 가장 우아합니다.
Jacob Vlijm

2

한 파일에서 다른 파일로 선택한 수의 열을 이동하려면

#!/usr/bin/env python3

cols = 1; file_1 = "/path/to/file_1"; file_2 = "/path/to/file_2"

def readfile(file):
      with open(file) as src:
          return [item.strip().split(",") for item in src.readlines()]

file_1 = readfile(file_1); file_2 = readfile(file_2)

for i in range(len(file_1)):
    print((",").join(file_1[i]+file_2[i][-cols:]))

두 파일에서 :

file_1

A,B
A,B
A,B
A,B

file_2

K,L,M
K,L,M
K,L,M
K,L,M

당신이 설정하면 cols = 1:

A,B,M
A,B,M
A,B,M
A,B,M

그러나 당신이 설정할 때 cols = 2:

A,B,L,M
A,B,L,M
A,B,L,M
A,B,L,M

cols = 3:

A,B,K,L,M
A,B,K,L,M
A,B,K,L,M
A,B,K,L,M

사용하는 방법

빈 파일로 복사의 경로를 설정 file1, file2및 열 수가로 저장, 이동 move.py에 의해 실행 :

python3 /path/to/move.py

이 방법으로 소스 파일 열의 중간에서 하나 이상의 열을 추가 할 수도 있습니다.


그래도 당신이 사용하는 것을보고 싶어했을 것 import csv입니다.
don.joey

@ don.joey 제안에 감사드립니다.
Jacob Vlijm

0

csv 모듈을 통한 파이썬의 또 다른 방법.

script.py

#!/usr/bin/python3
import csv
import sys
file1 = sys.argv[1]
file2 = sys.argv[2]
with open(file2, 'r') as r:
    with open(file1, 'r') as f:
        csv_f = csv.reader(f)
        csv_r = csv.reader(r)
        bar = [linex for linex in csv_r]
        foo = [liney[2:] for liney in csv_f]
        zipped = zip(bar,foo)
        result = [x+y for (x,y) in list(zipped)]
        for i in result:
            print(','.join(i))

위 스크립트를 실행하려면

python3 script.py file1 file2

산출:

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.