如何将空行分隔多行字段的TXT转换为指定格式CSV文件
问题描述
现有多份同结构文本文件,单文件内容格式如下:
name1 ... nameN title1 ... titleM abstract1 ... abstractO ID
各文件中N、M、O的数值不固定,所有字段通过空行分隔。需将该类数据转换为指定CSV格式:
- 单个文件对应输出一行
- 每行包含name、title、abstract、ID四个字段
- 同一字段内的多行内容直接拼接为单条字符串
- 字段间使用
|作为分隔符
目标输出示例:
name1 ...nameN|title1 ... titleM|abstract1 ... abstractO|ID
此前尝试使用awk、sed实现未达预期,需可直接运行的可行方案。
解决方案
使用awk实现最适配该场景,空行分隔的段落刚好对应4个目标字段,命令逻辑简洁且鲁棒性强,可自动忽略连续空行、文件首尾多余空行的干扰。
单文件处理
执行以下命令即可处理单个文件,直接输出符合要求的行内容:
awk -v RS='' -v ORS='' '{printf "%s%s", $0, (NR<4?"|":"\n")}' 你的文件路径
参数说明:
-v RS='':将awk的记录分隔符设置为空串,自动按空行切分内容,每个切分出的段落对应一个目标字段-v ORS='':关闭awk默认的记录输出自动追加换行的逻辑,避免产生多余换行- 执行逻辑:遍历切分后的4个段落,前3个字段输出后追加
|分隔符,第4个ID字段输出后追加换行,段落内的多行内容会自动拼接为空格分隔的连续字符串,完全匹配需求。
如果需要同字段内的多行内容完全无间隔拼接(不要自动填充的空格),使用以下变体命令即可:
awk -v RS='' -v ORS='' -v OFS='' '{printf "%s%s", $0, (NR<4?"|":"\n")}' 你的文件路径
批量处理
如果需要批量处理当前目录下所有后缀为.data的目标文件,合并输出到同一个结果CSV,执行以下脚本即可:
# 若不需要CSV表头可删除下一行 echo "name|title|abstract|ID" > result.csv # 遍历所有.data文件追加结果 for file in *.data; do awk -v RS='' -v ORS='' '{printf "%s%s", $0, (NR<4?"|":"\n")}' "$file" >> result.csv done
执行完成后结果会保存在当前目录的result.csv文件中。
内容的提问来源于stack exchange,提问作者Kiwikatze
相关产品推荐
相关产品推荐

