%3F%20.png)
Файл:
data
A B
C D
data
E F
G H
data
I J
K L
M N
Желаемый результат:
I J
K L
M N
Как разделить по "данным"? Я искал в Google информацию о том, как использовать awk, но большинство относительно awk разделяют столбец.
решение1
Чтобы использовать data
в качестве разделителя записей и напечатать последнюю запись:
$ awk -v RS=data 'END{print}' File
I J
K L
M N
Для этого требуется awk, например GNU awk (gawk) или mawk, который поддерживает многосимвольные значения для RS
.
решение2
$ awk '/^data/ { lines = ""; next } { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
I J
K L
M N
Это используется awk
для получения содержимого ввода после последней строки, которая начинается со строки data
. Это делается путем сохранения каждого раздела строк после такой строки в lines
переменную. Каждый раз, когда встречается строка, которая начинается с data
, эта переменная очищается. Значение переменной выводится при достижении конца ввода.
С использованием sed
:
$ sed -n 'H;${ x; s/.*\ndata\n//p; }' file
I J
K L
M N
Мы добавляем все строки в пространство удержания. При обнаружении последней строки пространство удержания заменяется на пространство шаблона, и все до строки data
(с обеих сторон от нее — символ новой строки) удаляется, прежде чем будут напечатаны оставшиеся биты.
С использованием ed
:
$ printf "?^data?ka\n1,'ad\n,p\nQ\n" | ed -s file
I J
K L
M N
или,
ed -s file <<END_ED
?^data?ka
1,'ad
,p
Q
END_ED
Здесь мы сначала ищем в обратном направлении последнее вхождение строки data
в начале строки и помечаем эту строку (мы называем меткой a
). Затем мы удаляем от начала буфера до помеченной строки. ,p
Просто выводит полное содержимое буфера.
При использовании не-GNU ed
финальная команда Q
(для выхода без сохранения) вероятно не нужна.
решение3
Чтобы разделить записи по «данным» вместо новой строки, установите переменную RS (разделитель записей).
Вас интересует только 4-я запись (первая запись находится перед первыми «данными»; она пуста), поэтому печатайте только тогда, когда NR равно 4.
cat file | awk 'BEGIN {RS="data\n"}; NR==4 {print}'
решение4
Сделано следующим методом, и все сработало отлично. Команда:
tac file.txt|sed -n '1,/data/p'| tac| sed -n '2,$p'
выход
I J
K L
M N