сохранить несколько совпадений в списке (grep или awk) - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть файл, который выглядит примерно так:

# a mess of text
Hello. Student Joe Deere has
id number 1. Over.
# some more messy text
Hello. Student Steve Michael Smith has
id number 2. Over.
# etc.

Я хочу записать пары (Joe Deere, 1), (Steve Michael Smith, 2) и т. Д. В список (или два отдельных списка с одинаковым порядком). А именно, мне нужно будет перебрать эти пары и что-то сделать с именами и идентификаторами.

(имена и идентификаторы указаны в разных строках, но в следующем порядке: name1, id1, name2, id2 и т. Д.). Я могу извлечь интересующие строки с

VAR=$(awk '/Student/,/Over/' filename.txt)

Я думаю, что знаю, как извлечь имена и идентификаторы с помощью grep, но это даст мне результат как один большой блок, такой как

`Joe Deere 1 Steve Michael Smith 2 ...`

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

Я уверен, что в awk есть однострочная строка, которая будет делать то, что мне нужно. Возможности безграничны, а документация монументальна.

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Не могли бы вы попробовать тоже.

awk '
/id number/{
  sub(/\./,"",$3)
  print val", "$3
  val=""
  next
}
{
  gsub(/Hello\. Student | has.*/,"")
  val=$0
}
'  Input_file
0 голосов
/ 03 ноября 2018
grep -oP 'Hello. Student \K.+(?= has)|id number \K\d+' file | paste - -
0 голосов
/ 03 ноября 2018
$ cat tst.awk
/^id number/ {
    gsub(/^([^ ]+ ){2}| [^ ]+$/,"",prev)
    printf "(%s, %d)\n", prev, $3
}
{ prev = $0 }

$ awk -f tst.awk file
(Joe Deere, 1)
(Steve Michael Smith, 2)
...