我有一个包含记录的文件。记录格式如下:
Record: XXXXXX [
{variable number of lines and content}
]
在记录中的某个点,可能有一个以
Start to do this thing
我想提取记录号以及记录中与“开始”一词匹配的行
目前我正在使用
egrep "Record|Start" inputfile.txt >> outputfile.txt
但我必须手动删除Record
未Start
匹配的匹配行。理想情况下,我希望这一步就能完成。我将不胜感激任何建议。
答案1
awk解决方案:
样本input.txt
文件:
Record: 111111 [
text
test
Start to do this thing
text
]
Record: 222222 [
{variable number of lines and content}
]
Record: 333333 [
text
text
text
Start to do another thing
text
]
工作:
awk '/^Record: .*\[$/{ f=1; n=$2 }/^\]/{f=0}f && /^Start/{ print n, $0 }' input.txt
输出:
111111 Start to do this thing
333333 Start to do another thing
答案2
使用您的示例文件,连续重复三次并进行修改:
Record: XXXXXX [
{variable number of lines and content}
Start to do this thing
]
Record: YYYYYY [
{variable number of lines and content}
Stop doing this thing
]
Record: ZZZZZZ [
{variable number of lines and content}
Start again
]
然后:
$ awk '/^Record:/ { r = $2 } /^Start/ { print r ":", $0 }' file
XXXXXX: Start to do this thing
ZZZZZZ: Start again
当我们看到以 开头的行时,我们只需拾取记录编号/标签Record:
并将其保存在变量中r
。然后,当我们找到以 开头的行时,Start
我们打印找到的任何记录标签和该行。
如果线路没有开始对于Start
,您可能需要将正则表达式更改为 ,/^Start/
以/^ *Start/
允许单词和行开头之间有任意数量的空格。
如果有的话这将会失败其他文件中的事物之间的记录相匹配Start
。