Как использовать awk для разделения строки (записи)?

Как использовать awk для разделения строки (записи)?

Файл:

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

Связанный контент