如何修改awk脚本实现含@行输出空行及指定内容提取
修改AWK脚本实现指定格式输出
问题描述
现有输入文件input.txt内容如下:
237 @ 0 2 3 4 0. ABC ABC DEF @ 237 0 1 4 7 2 0. 0 3 8 9 1 0. GHI XYZ
需求:
- (a) 只要某行包含符号
@,就在输出中添加一个空行; - (b) 若某行以
0开头且包含0.,提取0.之前的内容输出。
已有AWK脚本可实现需求(b),代码如下:
awk '{ for (i=1; i<NF; i++) if($i == "0") {arr[NR] = $i} else if ($i == "0.") {break} else {arr[NR]=arr[NR]" "$(i)}} ($1 == "0") {print arr[NR]} ' input.txt > output.txt
该脚本的当前输出为:
0 2 3 4 0 1 4 7 2 0 3 8 9 1
需要修改脚本同时满足两个需求,得到目标输出:
// <----Starting newline 0 2 3 4 0 1 4 7 2 0 3 8 9 1
解决方案:修改后的AWK脚本
awk ' /^@/ || /@$/ { print ""; next } # 匹配含@的行,输出空行后跳过该行后续处理 $1 == "0" { line = "" for (i=1; i<=NF; i++) { if ($i == "0.") break # 遇到0.就停止拼接字段 line = line $i " " } sub(/ $/, "", line) # 移除末尾多余的空格 print line } ' input.txt > output.txt
脚本逻辑说明
- 处理需求(a):用正则
/^@/ || /@$/匹配所有包含@的行(不管@在该行开头还是结尾),遇到这类行直接输出空行,再用next跳过该行的其他处理逻辑。这样输入第一行237 @会触发输出起始空行,输入第五行@ 237会触发输出空行分隔前后的结果。 - 处理需求(b):保留原脚本的核心逻辑,遍历当前行的每个字段,直到碰到
0.就停止拼接,最后去掉拼接后行尾多余的空格,再输出处理后的内容。
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

