如何修改sed命令提取指定行首尾n字符并合并输出
需求与问题描述
我目录下有多个结构相似的文件,内容结构示例如下:
.... .... pattern one some information Important-1 .... .... pattern two line1 line2 line3 line4 line5 Important-2 some information .... ....
我需要从文件特定行中提取带Important的信息。目前使用以下命令提取目标行:
sed -n '/pattern two/{ n; n; n; n; n; p }; /pattern one/{n; p }' * > output.txt
得到的输出为:
some information Important-1 Important-2 some information
现在需要修改命令,实现以下效果:
- 保留第一行末尾的n个字符(即
Important-1) - 保留第二行开头的n个字符(即
Important-2) - 将两部分内容合并为一行,格式如下:
Important-1 Important-2
请问最优的实现方式是什么?
最优实现方案
推荐直接使用awk一站式处理,无需额外管道调用,效率更高且逻辑清晰。假设需要提取的字符数n=11(对应Important-1/Important-2的长度),命令如下:
n=11 awk -v len="$n" ' /pattern one/ { getline; imp1 = substr($0, length($0) - len + 1, len) } /pattern two/ { for(i=1; i<=5; i++) getline; imp2 = substr($0, 1, len); print imp1 "\t" imp2 } ' * > output.txt
命令解释:
-v len="$n":将外部变量n传递给awk,方便调整提取的字符长度- 匹配
pattern one时:读取下一行目标行,用substr提取该行末尾len个字符,存入变量imp1 - 匹配
pattern two时:连续读取5行(跳过line1到line5),读取目标行后用substr提取开头len个字符,存入变量imp2,最后打印imp1和imp2,用制表符分隔
预期输出:
Important-1 Important-2
如果需要调整提取的字符数,只需修改n的值即可,灵活性强。
内容的提问来源于stack exchange,提问作者rgb
相关产品推荐
相关产品推荐

