如何将Endnote导出文件中含Graz的作者地址行调整至%+字段首位
问题解答
结论
这个需求完全可以通过Bash生态下的文本处理工具实现,不需要专门开发Delphi程序,使用awk即可快速完成处理,适合单文件或批量文件操作,效率远高于手动开发导入处理程序。
实现思路
Endnote导出文件的字段规则清晰:以%+开头的行是作者地址字段的起始,后续所有非%开头的行都属于该地址字段的内容,每行对应一个作者地址。处理逻辑如下:
- 识别
%+开头的行,进入地址块处理模式 - 将地址块内的所有行分为两类:包含
Graz的行、不包含Graz的行,两类内容内部都保留原始的先后顺序 - 地址块结束时,优先输出所有含
Graz的地址行,再输出其余地址行,其余非地址字段内容保持原样输出
可用处理脚本
直接运行以下命令即可完成单个文件的处理:
awk ' BEGIN { in_addr = 0 graz_cnt = 0 other_cnt = 0 # 取消下面一行的注释可开启大小写不敏感匹配,支持Graz/graz/GRAZ等写法 # IGNORECASE = 1 } in_addr == 1 { if (/^%/) { # 地址块结束,输出分类后的地址 for (i=0; i<graz_cnt; i++) { print i == 0 ? "%+ " graz_lines[i] : graz_lines[i] } for (i=0; i<other_cnt; i++) { print (graz_cnt == 0 && i == 0) ? "%+ " other_lines[i] : other_lines[i] } # 输出当前新字段行 print $0 in_addr = 0 graz_cnt = other_cnt = 0 next } /Graz/ ? graz_lines[graz_cnt++] = $0 : other_lines[other_cnt++] = $0 next } /^%\+/ { in_addr = 1 sub(/^%\+ ?/, "", $0) /Graz/ ? graz_lines[graz_cnt++] = $0 : other_lines[other_cnt++] = $0 next } { print } END { if (in_addr) { for (i=0; i<graz_cnt; i++) { print i == 0 ? "%+ " graz_lines[i] : graz_lines[i] } for (i=0; i<other_cnt; i++) { print (graz_cnt == 0 && i == 0) ? "%+ " other_lines[i] : other_lines[i] } } } ' 输入的Endnote导出文件.txt > 处理后的输出文件.txt
适用场景说明
- 该脚本兼容所有标准Endnote导出格式,只要字段规则不变就可直接使用
- Windows环境可通过WSL、Git Bash工具运行该命令,无需额外开发
- 可直接扩展为批量处理脚本,一次性处理多个导出文件
内容的提问来源于stack exchange,提问作者Walter Schrabmair
相关产品推荐
相关产品推荐

