如何用pdftotext与sed/bash脚本预处理PDF导出的文本文件?
问题
使用pdftotext -layout *.pdf提取PDF文本用于数据挖掘,生成的文本需完成以下预处理:
- 每行开头为13位GTIN码或5位PLU码,需将码后的单个空格替换为至少两个空格,避免与描述字段的单词间空格混淆,方便后续转制表符;
- 删除所有单/多行空行,仅保留数据行的换行分隔;
- 最终生成字段间为单个制表符的TSV文件(描述含逗号,不用CSV)。
已尝试sed/grep/awk/tr等工具,但无法整合满足需求,希望用单一工具(如sed)一次性解决。
示例输入(空格替换为•,换行替换为¶):
9415077026340•Pams•Sour•Cream•&•Chives•Rice•Crackers•100g•••$1.19¶ ¶ ¶ 9415077026296•Pams•BBQ•Chicken•Rice•Crackers•100g•••$1.19¶ ¶ 61424••••••••••••Yoghurt•Raisins•kg•••$23.90/kg¶ ¶ 9415077036349•Pams•Sliced•Peaches•In•Juice•410g•••$1.29¶
预期结果(制表符替换为⇥):
9415077026340⇥Pams•Sour•Cream•&•Chives•Rice•Crackers•100g⇥$1.19¶ 9415077026296⇥Pams•BBQ•Chicken•Rice•Crackers•100g⇥$1.19¶ 61424⇥Yoghurt•Raisins•kg⇥$23.90/kg¶ 9415077036349⇥Pams•Sliced•Peaches•In•Juice•410g⇥$1.29¶
解决方案
可以用这条sed命令一次性完成所有需求:
sed -E '/^[[:space:]]*$/d; s/^([0-9]{5}|[0-9]{13}) /\1 /; s/[[:space:]]{2,}/\t/g' input.txt > output.tsv
命令分步解释:
- 清除空行:
/^[[:space:]]*$/d—— 匹配所有仅含空白字符或完全为空的行,直接删除; - 替换码后单空格为双空格:
s/^([0-9]{5}|[0-9]{13}) /\1 /—— 精准匹配行首的5位PLU或13位GTIN码,将其后方的单个空格替换为两个空格,确保和描述内的单词间单空格区分开; - 多空格转制表符:
s/[[:space:]]{2,}/\t/g—— 将所有连续两个及以上的空白字符统一替换为单个制表符,完成TSV格式转换。
内容的提问来源于stack exchange,提问作者Fritt Hm
相关产品推荐
相关产品推荐

