我有要提取和重新排列某些数据的文件,旧文件包含原始数据,此文件为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文件顺序附加它们。
正如您似乎在使用post-ponned sid:
s(references:
乘以其和sids:
=的单=>对)相乘,这是两个解决方案。references:
sid:
简单地使用tac
命令(以相反的顺序是cat)来反转输入和输出:tac input | awk | tac > output
对于awk部分,只需复制sid:
s:
gawk '/^sid:/{sid=$0};/^reference:/{print sid "\n" $0}'
将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] 删除。
我来说两句