извлечь строки между тем же ключевым словом, которые соответствуют шаблону - PullRequest
1 голос
/ 22 апреля 2020

Необходимо сопоставить шаблон, который является уникальным для всего файла, но необходимо напечатать строки между двумя маркерами, где шаблон соответствует.

Мой файл выглядит следующим образом.

echo "Start 2A25.20090401.64809.7.HDF 6420 6751"
echo "dimensions 9249 49"
echo "New Cell"
grep "6542,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 20.09 8.07334 74.6131 170 0 6 6
grep "6542,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 32.25 8.11139 74.6406  210 3.66764
grep "6543,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 33.28 8.05147 74.6431  210 0.84248
grep "6543,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 43.38 8.08952 74.6707  210 20.3994
grep "6543,08" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 24.22 8.12717 74.6979  210 1.21783
grep "6544,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 35.81 8.02963 74.6732  210 6.31353
grep "6544,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 41.58 8.06767 74.7007  200 14.5371
grep "6545,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 36.3 8.00776 74.7033  120 6.13395
grep "6545,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 31.57 8.0458 74.7308  210 4.22794
grep "6546,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 28.49 7.98589 74.7333  292 2.64533
echo "New Cell"
grep "6562,21" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 26.74 8.19021 75.6125 210 0.61061 9 9
grep "6563,20" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 26.35 8.13187 75.6167  210 1.0852
grep "6563,21" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 42.51 8.16825 75.6426  200 13.5489
grep "6563,22" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 25.82 8.20457 75.6684  210 0.615512
grep "6564,20" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 23.08 8.10994 75.6467  272 0.613962
grep "6564,21" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 46.55 8.14632 75.6726  200 17.1675
grep "6564,22" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 36.89 8.18263 75.6984  200 3.10095
grep "6565,21" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 31.61 8.12436 75.7026  200 2.52639
grep "6565,22" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 28.85 8.16067 75.7284  120 0.945648
echo "New Cell"

Мне нужно sed для сопоставления с шаблоном и печати всех строк в ячейке, где шаблон соответствует. Например, для «6545,06» в качестве шаблона мне нужны все линии, которые находятся между границами «Новой ячейки», где шаблон соответствует, для этого шаблона необходимо вывести как

grep "6542,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 20.09 8.07334 74.6131 170 0 6 6
grep "6542,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 32.25 8.11139 74.6406  210 3.66764
grep "6543,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 33.28 8.05147 74.6431  210 0.84248
grep "6543,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 43.38 8.08952 74.6707  210 20.3994
grep "6543,08" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 24.22 8.12717 74.6979  210 1.21783
grep "6544,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 35.81 8.02963 74.6732  210 6.31353
grep "6544,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 41.58 8.06767 74.7007  200 14.5371
grep "6545,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 36.3 8.00776 74.7033  120 6.13395
grep "6545,07" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 31.57 8.0458 74.7308  210 4.22794
grep "6546,06" ../TextFilesDir/out.2A25.20090401.64809.7.HDF.txt.text = 28.49 7.98589 74.7333  292 2.64533

К сожалению, границы начала и конца являются одни и те же. Буду признателен, если я смогу сделать для этого сценарий sed.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Это может сработать для вас (GNU sed):

sed '/New Cell/ba;H;$!d;:a;x;/6546,06/s/.//p;z;x;d' file

Соберите строки, следующие за строкой, содержащей New Cell в области удержания (HS).

При обнаружении другой линии содержащий New Cell или конец файла достигнут, проверьте коллекцию на наличие требуемой строки (6546,06 в примере выше) и напечатайте коллекцию без первого символа, который будет введенным символом новой строки.

Независимо от совпадения, очистите ГС и повторите.

0 голосов
/ 22 апреля 2020

У меня нет sed сейчас, но следующее регулярное выражение извлекает именно то, что вы хотите (если я правильно понял):

echo "New Cell"\s*(.*?"6542,06".*?)\s*echo "New Cell"

Вы можете извлечь только строки "grep", используя \1.

Замените часть "6542,06" в регулярном выражении для других подстрок.

Я проверял регулярное выражение здесь .

...