@
ranxi 可以试试用 sqlite ,几行搞定 导入+翻译+输出,感觉速度应该也不慢
1. 生成 O2.txt (从小写字母,映射至大写字母,共 26 行)
printf "%s\n" {a..z} | sed 's/^.*$/&\t\U&/' | tee O2.txt
『输出』
a A
b B
… …
z Z
2. 生成 O1.txt (也是 26 行,字段内容是:主键 ID 、预期转换成啥样、待转换内容)
printf "%s\n" {a..z} | awk -v OFS=$'\t' '{print NR, toupper($0), $0}' | tee O1.txt
『输出』
1 A a
2 B b
… … …
26 Z z
3. 导入映射表至数据库
sqlite3 -tabs O2.db 'CREATE TABLE O2 (key PRIMARY KEY, value) WITHOUT ROWID' '.import O2.txt O2'
4. 逐行查数据库进行翻译
4.1 为 SQLite 启用 csv 扩展
①下载 csv.c:
https://www.sqlite.org/src/file?name=ext/misc/csv.c&ci=tip②编译扩展:参考
https://sqlite.org/loadext.html4.2 翻译
SQLITE_CSV_LIB_PATH='./csv' # 编译好的 CSV 模块库路径(可省略后缀)
SQLITE_CACHE_SIZE_MB=512 # 数据库最大缓存页面大小(单位:MB )
# sed -E 's/"/""/g; s/^|$/"/g; s/\t/","/g' O1.txt |
tr '\t' ',' < O1.txt | # 制表符 转成 逗号(要求 O1.txt 每列内容,都不包含『"』『,』,否则用上面那行)
sqlite3 -tabs O2.db \
".load $SQLITE_CSV_LIB_PATH" \
"PRAGMA cache_size = -$((SQLITE_CACHE_SIZE_MB << 10))" \
'CREATE VIRTUAL TABLE TEMP.O1 USING csv(filename="/dev/stdin", columns=3)' \
'SELECT O1.c0 id, O1.c1 expect, O2.value replaced FROM O1 LEFT JOIN O2 ON O1.c2 = O2.key'
『输出』
id expect replaced
1 A A
2 B B
… … …
26 Z Z