如何用sed/awk处理含换行段落的|分隔TXT数据集适配R readr导入
解决多行段落合并问题的sed/awk方案
没问题!这个场景刚好是sed和awk擅长处理的行合并需求,我给你准备了两种可行方案,附详细说明:
用awk实现(推荐,逻辑更直观)
awk的写法可读性强,容易理解和调整,适合这种按特定前缀合并行的需求:
awk '/^AA\|/ { if (prev != "") print prev; prev = $0; next } { prev = prev " " $0 } END { print prev }' your_input.txt > cleaned_output.txt
逻辑解释:
/^AA\|/:匹配以AA|开头的行(注意|是正则特殊字符,需要用\转义)- 当匹配到目标行时:
- 如果之前已经缓存了内容(
prev != ""),先把缓存的完整行打印出来 - 将当前行存入缓存变量
prev,并跳过后续处理
- 如果之前已经缓存了内容(
- 当遇到不以AA|开头的行时:
- 把当前行内容(带空格分隔)直接追加到缓存变量
prev的末尾
- 把当前行内容(带空格分隔)直接追加到缓存变量
END { print prev }:处理完所有行后,打印最后一行缓存的内容(避免遗漏最后一条数据)
用sed实现
sed通过保持空间(hold space)来暂存内容,适合喜欢用单行命令的场景:
sed -n '/^AA\|/{x;/./p;x;H};/^AA\|/!{H};${x;p}' your_input.txt > cleaned_output.txt
逻辑解释:
-n:关闭sed的自动输出模式,只打印我们指定的内容/^AA\|/{x;/./p;x;H}:匹配到AA|开头的行时:x:交换保持空间和模式空间的内容/./p:如果保持空间非空(有内容),就打印它x:再次交换回来,恢复当前行到模式空间H:把当前行追加到保持空间末尾
/^AA\|/!{H}:非AA|开头的行,直接追加到保持空间${x;p}:处理到最后一行时,交换保持空间和模式空间,打印最终合并后的内容
使用说明
把命令里的your_input.txt替换成你的实际数据集文件名,cleaned_output.txt是处理后的输出文件。处理完成后,用readr导入时,所有段落文本都会被合并到对应的字段中,不会再出现NA的情况。
内容的提问来源于stack exchange,提问作者nahata5




