Grep слово и с этой позиции grep вверх для другого слова - PullRequest
0 голосов
/ 01 мая 2020

У меня есть такой файл:

Record 1
x1   5
x2       0  7  0'BCD
x31   18
x45      45
x67  4

Record 2
x1              9
x2      0  6  0'BCD
x3           8
x35            6
x45       7
x88     3

Record 3
x1              5
x2                 0  5  0'BCD
x4           18
x35            16
x98     3


Record 4
x1              5
x2                 0  4  0'BCD
x4           18
x35            16
x45      77
x98     3

Для каждой записи меня интересуют значения перед x45 (если он существует в записи, если не существует, пропустите эту запись полностью) , И в случае обнаружения x45, go вверх, чтобы получить значение x2

Таким образом, желаемый вывод будет (Обратите внимание, что Record3 не имеет x45, поэтому он пропускается:

   45 , 0  7  0'BCD
   7  , 0  6  0'BCD
   77 , 0  4  0'BCD

Я могу гарантировать, что если x45 существует, то наверняка x2 будет существовать. Как я могу сделать это с помощью awk / sed / grep?

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

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

awk -v search="x45" -v before="x2" '
  $1==before{ p=""; for(i=2; i<=NF; i++)p=((p=="") ? "" : p "  ") $i}
  $1==search{ print $2 " , " p }
' file
45 , 0  7  0'BCD
7 , 0  6  0'BCD
77 , 0  4  0'BCD

Или с некоторым форматированием по левому краю:

$ awk -v search="x45" -v before="x2" '
  $1==before{ p=""; for(i=2; i<=NF; i++)p=((p=="") ? "" : p "  ") $i}
  $1==search{ printf "%-3s, %s" ORS, $2, p }
' file
45 , 0  7  0'BCD
7  , 0  6  0'BCD
77 , 0  4  0'BCD
2 голосов
/ 01 мая 2020
$ awk -F'\n' -v RS= '{print $NF, $2}' file

Address: street#3 Job:  Dentist
Address: street#4 Job:  Engineer
Address: street#5 Job:  Doctor

делая входной параметр метки

$ awk -F'\n' -v RS= -v term='Address' '{for(i=1;i<=NF;i++) 
                                          if($i~/^Job/) job=$i 
                                          else if($i~term) {a=$i; break}
                                        if(a) print a, job; 
                                        a=job=""}' file

, он не должен печататься, если поисковый термин не найден, но ваш пример не охватывает этот случай. Обратите внимание, что, как вы указали, если поисковый термин «Имя», он не будет работать, так как после этого появляется «Работа».

0 голосов
/ 01 мая 2020
$ sed -nE '/^x2/h;/^x45/{H;x;s|x2(.*)\nx45(.*)|\2 ,\1|p}' file
      45       7
       7      41
      77                 133

Вы можете передать это на column, чтобы получить визуально лучший вывод:

$ sed -nE '/^x2/h;/^x45/{H;x;s|x2(.*)\nx45(.*)|\2 ,\1|p}' file | column -t
45  ,  0  7  0'BCD
7   ,  0  6  0'BCD
77  ,  0  4  0'BCD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...