一行命令给现在的 cizu_raw.txt 自定义权重 #54
amorphobia
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
命令
我用 cizu_raw.txt 的前几行解释一下,假设 cizu_raw.txt 的内容是:
现在想要把「彬彬」的权重降低 300,把宾补的权重增加200,那么就在一个 cizu_patch.txt 文件里写如下内容(tab 分割):
然后用上面的命令,就可以得到调整权重之后的 result.txt
解释
awk 命令
中间先不看,这个命令整体的结构是
awk ...... cizu_patch.txt cizu_raw.txt > result.txt,就是用 awk 按照先 cizu_patch.txt 后 cizu_raw.txt 的顺序处理,把结果放到 result.txt-v OFS='\t'这个参数表示,输出结果时用 tab 分割,而不是空格。
NR==FNR这是个判断语句,其实完整的是包含接下来的两个花括号代码块的:
NR表示已经记录的文本总行数,FNR表示当前处理的文本中的行号。那么对于第一个处理的补丁文件 cizu_patch.txt,当前行号自然等于总行数,所以执行第一个花括号中的代码,而对于第二个处理的文件 cizu_raw.txt,当前行号不等于总行数,所以执行第二个花括号中的代码第一个花括号(处理 cizu_patch.txt)
{map[$1,$2] = $3; next}map[]在 awk 中表示一个键-值对映射,$加数字是文本中的第几列的意思,因此map[$1,$2]表示前两列(词语和声码)一起为键,在 map 中查找值,= $3表示把这个值设置为第三列(权重的增减)。第二个花括号(处理 cizu_raw.txt)
{print $1,$2,$3,$4+map[$1,$2],$5,$6}依次输出
$1,$2,$3,$4+map[$1,$2],$5,$6,代表的内容,其他的都好理解,分别是第一列(词语),第二列(声码),第三列(形码),第五列(附加权重), 第六列(注释)$4+map[$1,$2]表示的意思就是,把第四列(原有权重)加上 map 中查到的值,这里 map 中存的值就是 cizu_patch.txt 里面的 -300 / +200 了。别忘了,我们设置过用 tab 分隔,以及把结果放到 result.txt 里,最终在 result.txt 里的内容就是我们想要的:
可以见到「彬彬」变成700,「宾补」变成1099了。这个可以用于自己调序,不需要直接改官方的文件,官方更新后可以更容易维护自己的排序。
Beta Was this translation helpful? Give feedback.
All reactions