我有一个看起来像这样的文件:
# 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在不同的行上,但顺序为:name1
,id1
,name2
,id2
等)。我能够用
VAR=$(awk '/Student/,/Over/' filename.txt)
我想我知道如何使用grep
提取名称和ID,但这会像一个大块一样给我结果
`Joe Deere 1 Steve Michael Smith 2 ...`
(甚至可能在名称和ID之间使用分隔符)。我现在不确定如何进行此操作,无论如何,这都不是正确的方法。
我确定awk
中有一个单线可满足我的需要。可能性是无限的,而文档则是巨大的。
有什么建议吗?
答案 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 - -