TSVが2つあります(タブ区切り値) 文書file_A.txt
とfile_B.txt
file_A.txt
2つの列が含まれています - 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
一時ファイルの作成など)。