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

如何用awk提取特定序列行数据并转为行式排列?

解决方法:用AWK合并分组数据行

针对你的需求,这里提供几个清晰易懂的AWK方案,适合初学者理解:

方案1:简洁版(快速实现)

这个脚本通过缓存数据行并计数,遇到标题行(多字段行)时输出缓存内容:

BEGIN { count=0 }
# 遇到多字段的标题行,输出之前缓存的内容并重置
NF > 1 {
    if (count > 0) print line
    line = ""
    count = 0
    next
}
# 单字段的数据行,追加到缓存并计数
{
    line = line $0 " "
    count++
}
# 文件末尾处理剩余未输出的内容
END {
    if (count > 0) print line
}

使用方法

将上述代码保存为merge.awk,然后运行:

awk -f merge.awk 你的输入文件名 > 输出文件名

或者直接用单行命令:

awk 'BEGIN { count=0 } NF>1 { if (count>0) print line; line=""; count=0; next } { line=line $0 " "; count++ } END { if(count>0) print line }' 输入文件 > 输出文件

方案2:精准版(避免末尾多余空格)

如果不想让输出行末尾带多余空格,可以用数组存储每组数据,再格式化输出:

BEGIN { group_idx=0 }
# 处理标题行:输出上一组数据并重置数组
NF > 1 {
    if (group_idx > 0) {
        printf "%s %s %s\n", data[1], data[2], data[3]
        group_idx=0
    }
    next
}
# 数据行存入数组
{ data[++group_idx] = $0 }
# 处理最后一组数据
END {
    if (group_idx > 0) {
        printf "%s %s %s\n", data[1], data[2], data[3]
    }
}

逻辑说明

  • AWK的NF变量表示当前行的字段数,标题行(如a b c d)的NF>1,数据行(如x1)的NF=1,以此区分两类行。
  • 方案1用字符串缓存数据行,计数到3时(或遇到下一个标题行时)输出;方案2用数组存储每组的3个数据,通过printf精准控制输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:15:38