仅打印某些指定的行

时间:2016-05-30 05:10:41

标签: awk sed grep

我的数据包含多行。一些行以值43250,1000.0,500.0,300.0开头,并且在这些行之间还有其他行。然而,顺序是写的(即,首先出现43250的行然后在几行之后出现1000.0,依此类推......)。并且有几种类型的出现。我想要的是:

  • 打印行包含 43250
  • 在包含1000.0
  • 的行后打印行
  • 后面是行CONTAINING 500.0
  • 后面是行CONTAINING 300.0

典型数据如下:

  43250 Values at 1200Z 20 Jul 1976
--------------------------------------------
   PRES   HGHT   TEMP    THTA   THTE   THTV
    hPa     m      C     K      K      K 
--------------------------------------------
 1000.0  -13                                                               
  969.0                  306.9  356.7  309.9
  850.0                  305.0  324.9  306.2
  700.0                  309.1  315.3  309.4
  500.0                  318.9         318.9
  400.0                  331.4         331.4
  300.0                  344.2         344.2

    43250 Values at 1200Z 21 Jul 1976
--------------------------------------------
   PRES   HGHT   TEMP    THTA   THTE   THTV
    hPa     m      C     K      K      K 
--------------------------------------------
 1000.0                                                                 
  500.0                  320           319
  400.0                  330           332

  43250 Values at 1200Z 22 Jul 1976
--------------------------------------------
   PRES   HGHT   TEMP    THTA   THTE   THTV
    hPa     m      C     K      K      K 
--------------------------------------------
 1000.0                                                       
  700.0                  309.4  314.9  308.2
  500.0                  318.9         318.9
  400.0                  331.0         330.2
  300.0                  340.2         345.8
  200.0                  340.3         346.4

所需的输出是:

  43250 Values at 1200Z 20 Jul 1976
  969.0                  306.9  356.7  309.9
  500.0                  318.9         318.9
  300.0                  344.2         344.2
  43250 Values at 1200Z 22 Jul 1976                  
  700.0                  309.4  314.9  308.2
  500.0                  318.9         318.9
  300.0                  340.2         345.8

(看到也可能存在根本不应该打印任何内容的数据组。只有在它们全部一起出现的情况下才需要。看到第二块数据被忽略,因为它没有包含300.0的行。 )

2 个答案:

答案 0 :(得分:1)

将以下脚本保存到文件中,然后调用awk -f script input.data

/43250/ { data[1] = $0 }
/500/ { data[3] = $0 }
/300/ {
    if (data[1] && data[2] && data[3]) {
        print data[1] "\n" data[2] "\n" data[3] "\n" $0;
    }
    delete data;
}
/1000/ { found = 1; next }
found { data[2] = $0; found = 0 };

如果该行包含43250或500,请记住它。如果该行包含1000,请保存下一行。如果该行包含300,则在数据完整时打印所有内容。重新开始。

答案 1 :(得分:0)

这个oneliner将起作用。

sed -n '/43250\|500\|300/p;/1000/{n;p}' file_name

说明:

&#34/43250 \ | 500 \ | 300 / P" Sed将搜索包含43250,500或300的行并打印输出抑制所有其他行(sed -n开关),也查找1000,转到下一行" / 1000 / n;"并打印出那条线。

希望这就是你要找的。享受。

此致 Pravi