从文件中提取并重新排列

成都

我有要提取和重新排列某些数据的文件,旧文件包含原始数据,此文件为Input

参考:cve,2017-8962 
sid:45885
参考:cve,2016-10033
参考:cve,2016-10034
参考:cve,2016-10045
参考:cve,2016-10074 sid:45917
参考:cve,2017-8046 
sid: 45976
参考:cve,2018-6577
参考:cve,2018-6578 sid:46062


下面的文件是New文件,其中包含所需的输出

参考:cve,2017-8962 
sid:45885
参考:cve,2016-10033 sid:45917
参考:cve,2016-10034 sid:45917
参考:cve,2016-10045 sid:45917
参考:cve,2016-10074 sid:45917
参考:cve,2017-8046 
sid:45976
参考:cve,2018-6577 sid:46062
参考:cve,2018-6578 sid:46062





说明:对于示例sid:45917,有四个引用(引用:cve,2016-10033参考:cve,2016-10034参考:cve,2016-10045参考:cve,2016-10074),我们需要拆分每个引用并将sid一个附加在另一个下方(注意:sid始终跟在reference后面),像这样有重复的块,因此,如果有多个引用,我们需要按New文件顺序附加它们。

Y牛

正如您似乎在使用post-ponned sid: s(references:乘以其sids:=的单=>对相乘,这是两个解决方案。references:sid:


解决方案1:倒车

简单地使用tac命令(以相反的顺序cat)来反转输入和输出:tac input | awk | tac > output

对于awk部分,只需复制sid:s:

gawk '/^sid:/{sid=$0};/^reference:/{print sid "\n" $0}'

解决方案2:数组

reference:它们存储在数组中,然后在遇到对应的数组时将它们吐回去sid:

gawk 'BEGIN{r=0};/^reference:/{ref[r++]=$0};/^sid:/{for(n=0;n<r;n++){print ref[n] "\n" $0};r=0}' /tmp/test.txt

/^reference:/{ref[r++]=$0} :对于以ref ...开头的每一行,请将其存储在数组中,然后将“ r”指针移动到下一个元素。

/^sid:/{for(n=0;n<r;n++){print ref[n] "\n" $0};r=0} :每当一行以sid开头时,遍历整个数组,直到r指针(for ...),并为每个元素打印存储的ref和当前行(= sid),然后将r重置为开始,这样我们就开始了再次与下一个参考。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章