대용량 파일의 문자열 교체

대용량 파일의 문자열 교체

TSV가 2개 있습니다(탭으로 구분된 값) 문서 file_A.txtfile_B.txt

file_A.txt두 개의 열을 포함합니다 -- A_ID,A_Name

file_B.txt4개의 열( B_ID1, B_Name1, B_ID2,) 을 포함합니다.B_Name2

각각을 반복해야 A_ID하며 일치하는 경우 또는 를 B_ID1그에 따라 B_ID2교체해야 합니다 B_Name1.B_Name2A_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임시 파일 생성).

관련 정보