2 METEOROLOGICAL DATA VERSION /
8 PR TD HR ZW ZT WD WS RI # / TYPES OF MOD/TYPE/ACC
3979316.8350 1050313.7180 4857065.7030 592.1910 PR SENSOR POS XYZ/H
END OF HEADER
10 1 1 0 0 15 927.9 4.3 99.1
10 1 1 0 1 15 927.9 4.3 99.1
10 1 1 0 2 15 927.9 4.3 99.1
10 1 1 0 15 15 927.9 4.2 99.1
10 1 1 0 16 15 927.9 4.2 99.0
10 1 1 0 30 15 927.7 4.1 99.1
10 1 1 0 31 15 927.7 4.1 99.1
10 1 1 0 45 15 927.5 4.1 99.1
10 1 1 0 46 15 927.5 4.0 99.1
10 1 1 1 0 15 927.4 4.1 99.1
10 1 1 1 1 15 927.4 4.1 99.1
在此文本数据示例中,如何按顺序提取“ END OF HEADER
”部分后第五列数字数据中的所有 0,15,30,45,如下所示;
10 1 1 0 0 15 927.9 4.3 99.1
10 1 1 0 15 15 927.9 4.2 99.1
10 1 1 0 30 15 927.7 4.1 99.1
10 1 1 0 45 15 927.5 4.1 99.1
10 1 1 1 0 15 927.4 4.1 99.1
答案1
一个简单的例子是:
$ awk '$5 == '0' || $5 == '15' || $5 == '30' || $5 == '45' {print}' test.txt
正如 fedorqui 在下面的评论中提到的那样,更快的一行代码是:
$ awk '$5 ~ /^(0|15|30|45)$/' test.txt
语法解释:
$5 - the desired column from the text.
~ - the match symbol... matching was between the two slashes (/).
^/$ - the regex symbols indicating the beginning and end of the field.
| - the or specifier for either item in the "()" group.
通过仅接受与符合匹配条件的项目相匹配的行来过滤标题~
。
答案2
grep
尽管awk
它是用于字段分离数据的首选工具,但它是完全可行的。
和grep
:
grep -E '^10[[:blank:]]+([^[:blank:]]+[[:blank:]]+){3}(0|15|30|45)[[:blank:]]' file.txt
10
在开始处匹配,([^[:blank:]]+[[:blank:]]+){3}
匹配接下来的 3 个字段,然后匹配第 5 个字段以获得所需的字段
如果你使用 PCRE ( -P
),你可以[:blank:]
用替换\s
,这样看起来会比较好看:
grep -P '^10\s+([^\s]+\s+){3}(0|15|30|45)\s' file.txt
例子:
$ cat file.txt
2 METEOROLOGICAL DATA VERSION /
8 PR TD HR ZW ZT WD WS RI # / TYPES OF MOD/TYPE/ACC
3979316.8350 1050313.7180 4857065.7030 592.1910 PR SENSOR POS XYZ/H
END OF HEADER
10 1 1 0 0 15 927.9 4.3 99.1
10 1 1 0 1 15 927.9 4.3 99.1
10 1 1 0 2 15 927.9 4.3 99.1
10 1 1 0 15 15 927.9 4.2 99.1
10 1 1 0 16 15 927.9 4.2 99.0
10 1 1 0 30 15 927.7 4.1 99.1
10 1 1 0 31 15 927.7 4.1 99.1
10 1 1 0 45 15 927.5 4.1 99.1
10 1 1 0 46 15 927.5 4.0 99.1
10 1 1 1 0 15 927.4 4.1 99.1
10 1 1 1 1 15 927.4 4.1 99.1
$ grep -E '^10[[:blank:]]+([^[:blank:]]+[[:blank:]]+){3}(0|15|30|45)[[:blank:]]' file.txt
10 1 1 0 0 15 927.9 4.3 99.1
10 1 1 0 15 15 927.9 4.2 99.1
10 1 1 0 30 15 927.7 4.1 99.1
10 1 1 0 45 15 927.5 4.1 99.1
10 1 1 1 0 15 927.4 4.1 99.1
$ grep -P '^10\s+([^\s]+\s+){3}(0|15|30|45)\s' file.txt
10 1 1 0 0 15 927.9 4.3 99.1
10 1 1 0 15 15 927.9 4.2 99.1
10 1 1 0 30 15 927.7 4.1 99.1
10 1 1 0 45 15 927.5 4.1 99.1
10 1 1 1 0 15 927.4 4.1 99.1
答案3
您可以使用sed
和来执行此操作awk
:(
假设您的主题文本位于名为的文件中example.txt
)
sed -n '/END OF HEADER/,${
/END OF HEADER/d
p
}' example.txt | awk '($5 == 0 || $5 == 15 || $5 == 30 || $5 == 45)'
归因 - awk 命令取自steeldriver 的评论
解释
塞德
- 忽略一切
/END OF HEADER/
/END OF HEADER/d
意味着删除包含模式空间之外的行/END OF HEADER/
,并且由于它不再位于模式空间中,因此下一个命令p
将不会执行任何操作- p - 将每一行拉入模式空间后进行打印
awk 的
- 如果第 5 列是 0 或 15 或 30 或 45 则打印它