csv 파일 2의 열 1을 읽고 파일 1의 열 2와 일치합니다. 텍스트가 일치하면 파일 1의 열 1 값을 파일 2에 추가합니다.

csv 파일 2의 열 1을 읽고 파일 1의 열 2와 일치합니다. 텍스트가 일치하면 파일 1의 열 1 값을 파일 2에 추가합니다.

파일 1.csv

9,hello-world.com.,A,192.168.0.9
1,hello1-world.com.,A,192.168.0.1
2,hello2-world.com.,A,192.168.0.2
3,hello3-world.com.,A,192.168.0.3
4,hello4-world.com.,A,192.168.0.4
5,hello5-world.com.,A,192.168.0.5
6,hello6-world.com.,A,192.168.0.6
7,hello7-world.com.,A,192.168.0.7
8,hello8-world.com.,A,192.168.0.8

파일 2.csv

hello4-world.com.,A,192.168.0.4
hello2-world.com.,A,192.168.0.2
hello7-world.com.,A,192.168.0.7

두 개의 csv 파일이 있고, file1에는 많은 데이터가 있고 file2에는 데이터가 적습니다. file1에서 file2의 열 1을 찾아야 합니다. 일치하는 텍스트에만 추가해야 하는 file1에서 file2까지의 첫 번째 열 값이 있어야 합니다.

출력에는 새 값으로 업데이트된 별도의 파일 또는 file2가 있어야 합니다.

예상 출력:

4,hello4-world.com.,A,192.168.0.4
2,hello2-world.com.,A,192.168.0.2
7,hello7-world.com.,A,192.168.0.7

Python 코드를 사용해 보았습니다.

#! /usr/bin/python

t = {}
address = {}

for lines in open("file2.csv"):
    columns = lines.strip().split(",")
    name = columns[0]
    t[name] = columns[1]
    address[name] = columns[2]
    
for lines in open("file1.csv"):
    columns = lines.strip().split(",")
    name = columns[1]
    try:
        print("{},{},{},{}".format(columns[0], name, t[name], address[name]))
    except KeyError:
        print("{},{},{},{}".format(columns[0], name, columns[2], columns[3]))

위의 코드를 시도했지만 file1의 모든 내용을 출력으로 복사했지만 file2의 일치하는 내용만 필요합니다.

미리 감사드립니다.

답변1

데이터가 정말 그렇게 단순하다면(필드 안에 쉼표가 없고, 필드 안에 줄 바꿈이 없고, 보여드린 매우 간단한 예 외에는 아무것도 없음) Python 스크립트가 실제로 필요하지 않습니다. 간단한 awk 한 줄짜리 작업을 수행할 수 있습니다.

$ awk -F, 'NR==FNR{a[$1]; next} $2 in a' file2.csv file1.csv 
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7

이는 단순히 첫 번째 파일을 읽고( NR==FNR"전체 입력 줄 번호가 현재 파일의 줄 번호와 동일함"을 의미하므로 "첫 번째 파일을 읽을 때"를 의미함) 첫 번째 필드를 a( a[$1])의 배열에 저장한 다음 두 번째 파일은 a배열에서 두 번째 필드를 찾을 수 있는 모든 행을 인쇄합니다 .

다음과 같이 할 수도 있습니다.

$ grep -Ff <(cut -d, -f1 file2.csv) file1.csv 
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7

그러나 이는 file1의 어떤 필드에 있는지에 관계없이 file2의 첫 번째 필드 값과 일치합니다.


중요한 경고:csv 파일은 매우 복잡할 수 있으므로 데이터를 완전히 제어할 수 있고 첫 번째 문장의 조건이 항상 충족된다는 것을 보장할 수 있는 경우(내부 쉼표 없음, 여러 줄 필드 없음)에만 이 기능을 사용하십시오.

관련 정보