You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

脚本逻辑说明

  1. 处理需求(a):用正则/^@/ || /@$/匹配所有包含@的行(不管@在该行开头还是结尾),遇到这类行直接输出空行,再用next跳过该行的其他处理逻辑。这样输入第一行237 @会触发输出起始空行,输入第五行@ 237会触发输出空行分隔前后的结果。
  2. 处理需求(b):保留原脚本的核心逻辑,遍历当前行的每个字段,直到碰到0.就停止拼接,最后去掉拼接后行尾多余的空格,再输出处理后的内容。

内容的提问来源于stack exchange,提问作者Tryer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:20:33