我的数据包含多行。一些行以值43250,1000.0,500.0,300.0开头,并且在这些行之间还有其他行。然而,顺序是写的(即,首先出现43250的行然后在几行之后出现1000.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的行。 )
答案 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