awk - 处理带有标题、子标题和记录的文件

LAK*_*ANA 1 awk

我有一个具有以下格式的数据文件:

Header:H1
Sub-header:H1S1
Record:R1
Record:R2
Sub-header:H1S2
Record:R5
Record:R6
Sub-header:H1S3
Record:R9
Record:R10
Header:H2
Sub-header:H2S1
Record:R15
Record:R16
Header:H3
Sub-header:H3S1
Record:R25
Record:R26
Sub-header:H3S2
Record:R30
Record:R31
Run Code Online (Sandbox Code Playgroud)

我想使用 AWK 处理此文件,使文件具有以下格式:

H1, H1S1, R1
H1, H1S1, R2
H1, H1S2, R5
H1, H1S2, R6
H1, H1S3, R9
H1, H1S3, R10
H2, H2S1, R15
H2, H2S1, R16
H3, H3S1, R25
H3, H3S1, R26
H3, H3S2, R30
H3, H3S2, R31
Run Code Online (Sandbox Code Playgroud)

怎么做?

cas*_*cas 5

当您看到标题和副标题时,您需要记住它们,然后当您看到 Record: 行时打印它们(连同记录数据)。

$ awk -F: -v OFS=", " '/^Header:/     { header    = $2; next };
                       /^Sub-header:/ { subheader = $2; next };
                       /^Record:/     { print header, subheader, $2 }' input.txt 
H1, H1S1, R1
H1, H1S1, R2
H1, H1S2, R5
H1, H1S2, R6
H1, H1S3, R9
H1, H1S3, R10
H2, H2S1, R15
H2, H2S1, R16
H3, H3S1, R25
H3, H3S1, R26
H3, H3S2, R30
H3, H3S2, R31
Run Code Online (Sandbox Code Playgroud)

这些next语句是一个小的优化 - 因为一旦我们从中提取了 $2,我们就不需要当前行中的任何其他内容,跳到下一行输入并从脚本顶部再次开始处理。

对于这样的脚本,它对性能的影响很小(如果有的话)——它的作用并不大。对于更复杂的脚本,可能需要匹配大量模式或进行计算,这可能会产生重大影响。