如何从邮件转换的TXT文件提取指定字段并生成CSV行
问题需求
- 处理数千份由Contact Us表单邮件转换而来的TXT文件,提取First Name、Last Name、Long Text三个字段的值
- 邮件开头行数不固定,字段列用制表符分隔
- Long Text为多行内容,部分行带管道符
|,需要完整提取所有行内容 - 最终将提取结果按行写入CSV文件
无效尝试回顾
之前的命令无法解决字段名含空格、多行内容捕获的问题:
# 无法正确匹配带空格的字段名,提取结果混乱 awk -F'First Name|Last Name' '{print $2}' 1.txt # 仅能提取Long Text的第一行内容 awk -F'Long Text' '{print $2}' 1.txt
解决方案:awk多行处理脚本
单文件处理脚本
将以下代码保存为extract_form.awk:
BEGIN { FS = "\t" # 用制表符作为列分隔符 OFS = "," # CSV输出用逗号分隔 in_longtext = 0 first_name = "" last_name = "" long_text = "" } # 捕获First Name字段 /^\|First Name/ { first_name = $2 gsub(/^[[:space:]]*\|?|[[:space:]]*\|?$/, "", first_name) in_longtext = 0 } # 捕获Last Name字段 /^\|Last Name/ { last_name = $2 gsub(/^[[:space:]]*\|?|[[:space:]]*\|?$/, "", last_name) in_longtext = 0 } # 开始捕获Long Text多行内容 /^\|Long Text/ { in_longtext = 1 part = $2 gsub(/^[[:space:]]*\|?|[[:space:]]*\|?$/, "", part) long_text = part next } # 持续收集Long Text的后续行 in_longtext == 1 { part = $0 gsub(/^[[:space:]]*\|?|[[:space:]]*\|?$/, "", part) long_text = long_text " " part } # 遇到新字段行时,输出当前捕获的内容 /^\|[A-Za-z]/ && in_longtext == 0 && first_name != "" { # 转义内容中的逗号,避免CSV格式错误 gsub(/,/, "\\,", first_name) gsub(/,/, "\\,", last_name) gsub(/,/, "\\,", long_text) print first_name, last_name, long_text # 重置变量,准备处理下一组记录 first_name = "" last_name = "" long_text = "" } # 处理文件最后一条记录 END { if (first_name != "") { gsub(/,/, "\\,", first_name) gsub(/,/, "\\,", last_name) gsub(/,/, "\\,", long_text) print first_name, last_name, long_text } }
批量处理所有TXT文件
在终端执行以下命令,将所有.txt文件的提取结果输出到output.csv:
# 写入CSV表头 echo "First Name,Last Name,Long Text" > output.csv # 遍历所有txt文件,执行脚本并追加结果 for file in *.txt; do awk -f extract_form.awk "$file" >> output.csv done
关键说明
- 用制表符
\t作为字段分隔符,精准对应原始文件的列结构 - 通过
in_longtext标记位实现多行内容的持续捕获 - 用
gsub清理字段值前后的管道符|和多余空格 - 自动转义内容中的逗号,避免破坏CSV格式
内容的提问来源于stack exchange,提问作者Aidbfbx
相关产品推荐
相关产品推荐

