如何合并TSV文件中双引号内的多行单元格内容?
解决TSV文件中双引号内多行文本合并问题
需求说明
处理包含两列的TSV文件,仅合并双引号内的多行内容,保留原制表符分隔格式,其他行保持不变。
测试输入:
test try test "a short exam to measure somebody's knowledge or skill in something." testing examine
期望输出:
test try test "a short exam to measure somebody's knowledge or skill in something." testing examine
解决方案
使用awk跟踪引号状态,实现精准的多行合并:
awk -v FS='\t' -v OFS='\t' ' BEGIN { in_quote = 0 } { if (in_quote) { # 处于未闭合引号内,将当前行内容追加到缓存行,替换换行为空格 prev_line = prev_line " " $0 # 检查当前行是否包含闭合引号 if (gsub(/"/, "&") % 2 == 1) { in_quote = 0 print prev_line } } else { # 不在引号内,检查当前行是否有未闭合引号 if (gsub(/"/, "&") % 2 == 1) { in_quote = 1 prev_line = $0 } else { print $0 } } } # 处理文件末尾仍未闭合引号的异常情况 END { if (in_quote) print prev_line } ' test.tsv
脚本说明
in_quote变量标记当前是否处于未闭合的双引号环境中- 检测到未闭合引号时,将后续行内容追加到缓存变量
prev_line,并将换行替换为空格 - 检测到引号闭合时,输出合并后的完整行
- 未处于引号内的行直接输出,完全保留原TSV格式
测试结果
运行上述脚本后,输出与期望完全一致,同时严格保留了原文件的制表符分隔结构。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

