如何利用sed/awk/tr等工具实现文件内容的提取与合并以生成指定格式行?
如何利用sed/awk/tr等工具实现文件内容的提取与合并以生成指定格式行?
当然可以啦!用awk就能轻松搞定,甚至一行命令就解决,它处理多行数据的能力刚好适配你的需求。我给你拆解下思路和具体实现:
推荐方案:awk命令
awk可以逐行读取文件,把每一行需要的内容存起来,最后拼接成你要的格式。试试这个命令:
awk ' NR==1 { # 提取第一行除了末尾"blah1 blah2"的部分 main_text = $0 sub(/blah1 blah2$/, "", main_text) } NR==2 { # 取第二行里的0.202和0.303(对应第7、8个字段) val2 = $7 val3 = $8 } NR==3 { # 把第三行的0.404转成负数 val4 = -$4 # 拼接所有内容并输出 print main_text, val2, val3, val4 }' your_file.txt
如果想写成紧凑的一行版本,直接去掉换行就行:
awk 'NR==1{main_text=$0; sub(/blah1 blah2$/,"",main_text)} NR==2{val2=$7; val3=$8} NR==3{val4=-$4; print main_text, val2, val3, val4}' your_file.txt
简单解释下逻辑:
- 处理第一行时,用
sub命令删掉末尾的"blah1 blah2",保留前面的核心文本; - 处理第二行时,直接提取我们需要的两个数值字段;
- 处理第三行时,把目标数值取反,最后把所有存好的内容拼起来打印,就得到你要的结果啦。
备选方案:sed命令(局限性稍大)
如果想用sed也能实现,但它的逻辑会绕一些,而且依赖原文本的固定内容,格式稍有变化就容易失效,给你参考下:
sed -n '1{h;s/blah1 blah2$//};2{H;s/.* //;s/ .*//;H;s/.* //};3{H;x;s/\n/ /g;s/this is the next line 0.101 //;s/ this is the answer / -/;p}' your_file.txt
这个命令的思路是把三行内容都读进缓冲区,然后替换掉不需要的部分,最终拼接成目标行,但灵活性远不如awk,所以更推荐用awk的方案。
备注:内容来源于stack exchange,提问作者67kramer91
相关产品推荐
相关产品推荐

