如何用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
相关产品推荐
相关产品推荐

