Awk以某种格式打印某些行

时间:2016-09-09 14:57:21

标签: awk formatting printf

我有一个包含以下信息的文本文件。

Table X1: Circuit Thermal Overload Ratings for xxx
Rated Temperature: 50 ºC 
ALL RATINGS ARE Winter Spring / Autumn Summer 
PER CIRCUIT Amps MVA Amps MVA Amps MVA 
Pre-Fault Continuous 485 111 450 103 390 89 
Post-Fault Continuous 580 132 540 123 465 106   

Table X2: Circuit Thermal Overload Ratings for xxx 
Rated Temperature: 65 ºC 
ALL RATINGS ARE Winter Spring / Autumn Summer 
PER CIRCUIT Amps MVA Amps MVA Amps MVA 
Pre-Fault Continuous 555 126 520 119 470 108 
Post-Fault Continuous 660 150 620 142 560 128 

示例表的图像在这里: example table

我希望根据每行的第一个字段格式化行。 对于以“Pre”或“Post”开头的行,请在第一个字符串后面和每两个数字之间插入逗号。 printf(“%s%s,%d,%d,%d,%d,%d,%d \ n”,$ 1,$ 2,$ 3,$ 4,$ 5,$ 6,$ 7,$ 8) 对于以“ALL”开头的行,请在“ARE”,“Winter”和“Autumn”之后插入逗号。 对于以'PER'开头的行,请在'CIRCUIT','Amps'和'MVA'之后插入逗号。 对于其他行,请保留原始文本...

预期输出应该如下,

  • 所有评分均为,冬季,春季/秋季,夏季
  • PER CIRCUIT,Amps,MVA,Amps,MVA,Amps,MVA
  • 故障前连续,555,126,520,119,470,108
  • 故障后连续,660,150,620,142,560,128

我尝试了以下但是它没有产生我正在寻找的结果。任何帮助将不胜感激......

/Table/
{for(n=0; n<=5; n=n+1) {
    if(n<2){getline}
    if(n==2)
        {printf("%s%s%s,%s,%s%s%s,%s",$1,$2,$3,$4,$5,$6,$7,$8)}
    if(n==3)
        {printf("%s%s,%s,%s,%s,%s,%s,%s",$1,$2,$3,$4,$5,$6,$7,$8)}
    if(n==4||n==5)
        {printf("%s %s,%d,%d,%d,%d,%d,%d\n",$1,$2,$3,$4,$5,$6,$7,$8) }
    }
}

1 个答案:

答案 0 :(得分:1)

您的方法无济于事,而是使用模式匹配。这是您可以关注的模板

$ awk '/^ALL/ {print ...; next}
       /^PER/ {print ...; next}
       /^Pre/ || /^Post/ {print ...; next}
       {print}'  file