Shell-Script
從文件中提取和重新排列
我有要提取和重新排列某些數據的文件,舊文件包含原始數據,該文件是輸入
參考: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:
andsid:
),兩種解決方案。解決方案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 重置為開頭,這樣我們就開始了再次與下一個參考。