将多个匹配项保存在列表中(grep或awk)

时间:2018-11-03 11:51:51

标签: text awk grep string-matching

我有一个看起来像这样的文件:

# 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)等记录到一个列表(或两个具有相同顺序的独立列表)中。即,我将需要遍历这些对,并使用名称和ID做些事情。

(名称和ID在不同的行上,但顺序为:name1id1name2id2等)。我能够用

提取感兴趣的行

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

我想我知道如何使用grep提取名称和ID,但这会像一个大块一样给我结果

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

(甚至可能在名称和ID之间使用分隔符)。我现在不确定如何进行此操作,无论如何,这都不是正确的方法。

我确定awk中有一个单线可满足我的需要。可能性是无限的,而文档则是巨大的。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

$ 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)

答案 1 :(得分:1)

请您也可以尝试以下方法。

awk '
/id number/{
  sub(/\./,"",$3)
  print val", "$3
  val=""
  next
}
{
  gsub(/Hello\. Student | has.*/,"")
  val=$0
}
'  Input_file

答案 2 :(得分:0)

grep -oP 'Hello. Student \K.+(?= has)|id number \K\d+' file | paste - -