如何用sed命令合并包含相同关键字的多行内容?
问题:合并所有包含Job的行到同一行
输入文件file.txt内容如下:
ABC Job: Farmer DEFG Job: Plumber Job: Teacher GHIJ
期望输出:
ABC Job: Farmer,Plumber,Teacher DEFG GHIJ
尝试过以下无效命令:
sed '$!N;/Job: /s/\n/,/ file.txt'
解决方案
方法1:使用awk(推荐,逻辑清晰)
执行以下命令:
awk '/^Job:/{ if (first_job) { sub(/^Job: /, "", $0) jobs = jobs "," $0 } else { jobs = $0 first_job = 1 } next } { if (jobs) { print jobs jobs = "" first_job = 0 } print } END { if (jobs) print jobs }' file.txt
工作原理:
- 匹配以
Job:开头的行:首次匹配时直接保存整行;后续匹配时去掉开头的Job:,将职业内容用逗号追加到缓存变量中。 - 遇到非
Job:行时,先检查是否有缓存的Job内容,有则先打印,再打印当前行,同时重置缓存变量。 - 最后处理文件末尾可能剩余的未打印Job内容。
方法2:使用sed
执行以下命令:
sed -n ' /^Job:/{ H b } { x s/\nJob: /,/g s/^\n// p x p } ${ x s/\nJob: /,/g s/^\n// p }' file.txt
工作原理:
- 遇到
Job:行时,将其追加到保持空间(H命令),然后跳过后续命令。 - 遇到非
Job:行时,交换模式空间和保持空间,把保持空间里的多行Job内容中的\nJob:替换成逗号,去掉开头的空行后打印;再交换回模式空间打印当前非Job行。 - 处理文件最后一行时,单独处理保持空间中剩余的Job内容并打印。
原命令无效的原因
- 语法错误:命令末尾缺少闭合的斜杠,正确的语法应该是
sed '$!N;/Job: /s/\n/,/' file.txt。 - 逻辑局限:即使修正语法,该命令仅能合并相邻的两行,无法处理不连续的Job行,还会错误地将非Job行与下一行的Job行合并,完全不符合需求。
内容的提问来源于stack exchange,提问作者MayaDas
相关产品推荐
相关产品推荐

