TSV가 2개 있습니다(탭으로 구분된 값) 문서 file_A.txt
및file_B.txt
file_A.txt
두 개의 열을 포함합니다 -- A_ID
,A_Name
file_B.txt
4개의 열( B_ID1
, B_Name1
, B_ID2
,) 을 포함합니다.B_Name2
각각을 반복해야 A_ID
하며 일치하는 경우 또는 를 B_ID1
그에 따라 B_ID2
교체해야 합니다 B_Name1
.B_Name2
A_Name
file_B
수백 MB에 불과 해서 효율적인 방법을 찾고 있어요 .
어떤 제안이 있으십니까?
답변1
Spike가 제안한 대로 file_B.txt 형식을 대체하려는 경우 sqlite와 같은 경량 데이터베이스가 이를 수행할 수 있습니다.
다음 코드는 file_A.txt 및 file_B.txt를 임시 메모리 내 데이터베이스로 읽어 결과를 TSV 파일로 출력합니다.MODIFIED-file_B.txt
sqlite3 -separator $'\t' << EOF > MODIFIED-file_B.txt
CREATE TABLE a ( id INTEGER PRIMARY KEY, name );
.import file_A.txt a
CREATE TABLE b (id1 INTEGER,name1 TEXT,id2 INTEGER,name2 TEXT);
.import file_B.txt b
SELECT b.id1,
ifnull((SELECT name from a WHERE a.id=b.id1),b.name1),
b.id2,
ifnull((SELECT name from a WHERE a.id=b.id2),b.name2)
FROM b;
EOF
이는 각 파일을 별도의 테이블로 읽은 다음 사용 가능한 경우 대체 A를 사용하여 b 테이블을 출력하고, 그렇지 않으면 원래 B_name을 반환합니다.
메모리 사용량이 문제인 경우 파일 이름을 사용하여 실행할 수 있습니다(예: sqlite3 -separator $'\t' temporary.db
임시 파일 생성).