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
В этом примере текстовых данных, как я могу извлечь все 0,15,30,45 в 5-м столбце числовых данных в надлежащем порядке, после"END OF HEADER
"часть следующим образом;
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
Можно сделать это использование 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 было принято от Объяснения комментария
, Sed
/END OF HEADER/d
, средства удаляют строку, содержащую /END OF HEADER/
из пространства шаблона, и потому что больше в пространстве шаблона, следующая команда p
ничего не сделает Awk
Быстрый один лайнер был бы:
$ 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.
заголовок отфильтрован, только приняв строки, которые соответствуют объектам после соответствия ~
критерии.
Это совершенно выполнимо в 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