大きなテキストファイル(約2GB)があります。次のフィールドを含むCSVファイルがあります。
rowID,pattern,other
1,abc_1z1,90
2,abc_1z2,90
3,abc_1z10,80
4,abc_3p1,77
...
私の興味は、次のように大容量ファイルの内容を変更することです。大きなファイルの文字列がCSV(2番目のフィールド)の「パターン」と一致するたびに、その文字列を対応する「rowID」(最初のフィールド)に置き換えます。
これは私がsedを使ってみた方法ですが、これは非常に遅いです(また、ファイルの内部置換のため)しかし、より速い解決策がありますか?
while read f1 f2 f3;
do
sed -i "s/$f2/$f1/g" bigfile;
done < map.csv
map.csvには500,000を超える行が含まれています。
ベストアンサー1
sedは文字列ではなく正規表現を置き換えることに注意してください。現在のソリューションでこれを使用しているので、これがあなたのユースケースに問題ではないとします。
map.csv
1つのアプローチは、次の関数への単一の呼び出しに渡される一連の式で前処理することですsed -f
。
awk -F, 'NR>1 {printf "s/%s/%s/g\n", $2, $1}' map.csv | sed -f - bigfile
-i
(正しいことをしていると確信している場合にのみこれを追加してください)。