Shell-Script

從文件中提取和重新排列

  • January 17, 2019

我有要提取和重新排列某些數據的文件,舊文件包含原始數據,該文件是輸入

參考:cve,2017-8962
西德:45885
參考:cve,2016-10033
參考:cve,2016-10034
參考:cve,2016-10045
參考:cve,2016-10074
***西德:45917***
參考:cve,2017-8046
西德:45976
參考:cve,2018-6577
參考:cve,2018-6578
***西德:46062***

以下文件是包含所需輸出的新文件

參考:cve,2017-8962
西德:45885
參考:cve,2016-10033
*西德:45917*
參考:cve,2016-10034
*西德:45917*
參考:cve,2016-10045
*西德:45917*
參考:cve,2016-10074
*西德:45917*
參考:cve,2017-8046
西德:45976
參考:cve,2018-6577
*西德:46062*
參考:cve,2018-6578
*西德:46062*

.

說明:例如 sid:45917 有四個引用它們是(引用:cve,2016-10033 引用:cve,2016-10034 引用:cve,2016-10045 引用:cve,2016-10074),我們需要拆分每個引用並將 sid 附加在另一個下方(注意:sid 後面總是跟引用),像這樣有重複的塊,所以如果有多個引用,我們需要按新文件順序附加它們。

正如您似乎使用post-ponned sid: s(multipereferences:後跟它們的單個sids:=> 對references:and sid:),兩種解決方案。


解決方案1:倒車

簡單地使用tac命令(它是cat以相反的順序)來反轉輸入和輸出:tac input | awk | tac > output

對於 awk 部分,只需複制sid:s:

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

解決方案2:數組

reference:s 來時儲存在一個數組中,然後在遇到相應的時將它們吐出來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 重置為開頭,這樣我們就開始了再次與下一個參考。

引用自:https://unix.stackexchange.com/questions/494812