Как извлечь строки в определенном порядке - PullRequest
0 голосов
/ 26 октября 2018

У меня есть документ:

column1: 23
column2: 42
kolumn3: 24
column1: 24
column2: 35
kolumn3: 46
column1: 25
column2: 42
column1: 35
column2: 45
kolumn3: 52

И я хотел бы, чтобы мой вывод был:

column1: 23
column2: 42
kolumn3: 24
column1: 24
column2: 35
kolumn3: 46
column1: 35
column2: 45
kolumn3: 52

Выход должен быть в column1, column2, kolumn3 заказ.Удалите все, что не в этом порядке.

Возможно ли это сделать в grep, sed или awk?

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

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

sed ':a;N;/^column1:.*\ncolumn2:/!D;N;/\nkolumn3:/b;s/.*\n//;ta' file

Считайте две строки в пространство шаблона и, если они не совпадают, column1:, затем column2:, удалите первую и повторите. В противном случае добавьте третью строку и, если она соответствует kolumn3:, напечатайте все три строки, если нет, удалите первые две строки и вернитесь к началу сценария sed.

Другое решение:

sed -n '/\n/!N;N;/^column1:[^\n]*\ncolumn2:[^\n]*\nkolumn3:[^\n]*$/p;//!D' file
0 голосов
/ 26 октября 2018

Использование GNU awk:

awk -v RS='column1: [0-9]+\ncolumn2: [0-9]+\nkolumn3: [0-9]+\n' '{printf RT}' file

Разделитель записей RS является регулярным выражением, установленным для перехвата 3 последовательных строк.

Единственное утверждение - распечатать терминатор записи RT, исключив все, что не перехватывается RS.

0 голосов
/ 26 октября 2018

Другой (ошибка мозга, которая не оставит меня в покое, пока я не набрал его, хотя и довольно непроверенный):

$ awk '
BEGIN {
    p="column1:column2:kolumn3:"  # comparison pat- NO, something else ;D
}
p~"^" b $1 {                      # if gathered $1 buffer matches the p
    b=b $1                        # keep collecting
    c=c $0 ORS
    if(p==b) {                    # prefect match deserves to be outputed
        printf c
        b=c=""                    # reset buffer vars
    }
    next                          
}
{                                 # a non-match means a reset and restart 
    b=$1                          # for buffer vars
    c=$0 ORS
}' file

Вывод:

column1: 23
column2: 42
kolumn3: 24
column1: 24
column2: 35
kolumn3: 46
column1: 35
column2: 45
kolumn3: 52
0 голосов
/ 26 октября 2018

Это сделает трюк в awk, назовем это testcol.awk:

$1=="column1:" {l1=$0; n=2;}
$1=="column2:" && n==2 {l2=$0; n=3;}
$1=="kolumn3:" && n==3 {print l1 "\n" l2 "\n" $0; n=1}

Затем запустите что-то вроде

awk -f testcol.awk your_input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...