You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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|开头的行(注意|是正则特殊字符,需要用\转义)
  • 当匹配到目标行时:
    1. 如果之前已经缓存了内容(prev != ""),先把缓存的完整行打印出来
    2. 将当前行存入缓存变量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|开头的行时:
    1. x:交换保持空间和模式空间的内容
    2. /./p:如果保持空间非空(有内容),就打印它
    3. x:再次交换回来,恢复当前行到模式空间
    4. H:把当前行追加到保持空间末尾
  • /^AA\|/!{H}:非AA|开头的行,直接追加到保持空间
  • ${x;p}:处理到最后一行时,交换保持空间和模式空间,打印最终合并后的内容

使用说明

把命令里的your_input.txt替换成你的实际数据集文件名,cleaned_output.txt是处理后的输出文件。处理完成后,用readr导入时,所有段落文本都会被合并到对应的字段中,不会再出现NA的情况。

内容的提问来源于stack exchange,提问作者nahata5

火山引擎 最新活动