任何 sed 选项可以在达到一行号时停止匹配吗?

问题描述 投票:0回答:1

我有一个表,其中只有偶数行很重要(粗体),

时间 纬度 价值
2020 1 1 00:00:00 41.97 29.68 272.4456
2020 1 1 00:00:00 47.97 21.68 -32767
2020 1 1 01:00:00 41.97 29.68 272.3355
2020 1 1 01:00:00 47.97 21.68 -32767
2020 1 1 02:00:00 41.97 29.68 272.1232
2020 1 1 02:00:00 47.97 21.68 -32767
2020 1 1 03:00:00 41.97 29.68 271.8801
2020 1 1 03:00:00 47.97 21.68 -32767

但是,在某些时候,这会变成奇数行。这正是它发生变化的时刻(你可以看到两个连续的“-32767”):

时间 纬度 价值
2023 9 30 23:00:00 41.97 29.68 289.2723
2023 9 30 23:00:00 41.97 29.68 -32767
2023 10 1 00:00:00 41.97 29.68 -32767
2023 10 1 00:00:00 41.97 29.68 288.9512
2023 10 1 01:00:00 41.97 29.68 -32767
2023 10 1 01:00:00 41.97 29.68 288.7689
2023 10 1 02:00:00 41.97 29.68 -32767

我用

sed '1~2d' site8_slt.nc.tsv
提取它们后发现了这一点。有谁知道如何 sed 直到特定行号?这样我会 sed 两次,第一次是在更改之前,然后是在更改之后。

提前致谢!

上下文:我正在从 cds.climate.copernicus.eu 以 netCDF 格式下载数据,然后使用 cdo(气候数据运算符)将数据转换为 csv,并且,我不知道为什么,每行得到 2 个值,其中每个值值始终是填充值-32767。

我已经尝试过:我知道我可以用这个

$ sed '1s/a/b/' file
指向特定的行,但这只会改变一行,我想以某种方式 sed 一行之前的所有行,然后在一个特定的行之后以另一种方式 sed行号。

bash sed netcdf cdo-climate
1个回答
0
投票

回答您的具体问题:

$ seq 5 | sed -n '1,3p'
1
2
3

$ seq 5 | sed -n '4,$p'
4
5

但听起来,使用任何 sed 或任何 awk,这些中的任何一个可能对你更有用:

sed '/-32767$/d' file
awk '$NF != -32767' file

例如:

$ cat file
year    month   day     time    lat     lon     value
2020    1       1       00:00:00        41.97   29.68   272.4456
2020    1       1       00:00:00        47.97   21.68   -32767
2020    1       1       01:00:00        41.97   29.68   272.3355
2020    1       1       01:00:00        47.97   21.68   -32767
2020    1       1       02:00:00        41.97   29.68   272.1232
2020    1       1       02:00:00        47.97   21.68   -32767
2020    1       1       03:00:00        41.97   29.68   271.8801
2020    1       1       03:00:00        47.97   21.68   -32767
2023    9       30      23:00:00        41.97   29.68   289.2723
2023    9       30      23:00:00        41.97   29.68   -32767
2023    10      1       00:00:00        41.97   29.68   -32767
2023    10      1       00:00:00        41.97   29.68   288.9512
2023    10      1       01:00:00        41.97   29.68   -32767
2023    10      1       01:00:00        41.97   29.68   288.7689
2023    10      1       02:00:00        41.97   29.68   -32767

$ sed '/-32767$/d' file
year    month   day     time    lat     lon     value
2020    1       1       00:00:00        41.97   29.68   272.4456
2020    1       1       01:00:00        41.97   29.68   272.3355
2020    1       1       02:00:00        41.97   29.68   272.1232
2020    1       1       03:00:00        41.97   29.68   271.8801
2023    9       30      23:00:00        41.97   29.68   289.2723
2023    10      1       00:00:00        41.97   29.68   288.9512
2023    10      1       01:00:00        41.97   29.68   288.7689

$ awk '$NF != -32767' file
year    month   day     time    lat     lon     value
2020    1       1       00:00:00        41.97   29.68   272.4456
2020    1       1       01:00:00        41.97   29.68   272.3355
2020    1       1       02:00:00        41.97   29.68   272.1232
2020    1       1       03:00:00        41.97   29.68   271.8801
2023    9       30      23:00:00        41.97   29.68   289.2723
2023    10      1       00:00:00        41.97   29.68   288.9512
2023    10      1       01:00:00        41.97   29.68   288.7689
© www.soinside.com 2019 - 2024. All rights reserved.