正如其他人所說,你沒有指定你想一旦你的數據做什麼處理解析它。
如果你只是想提取一個特定的塊,來自Akshay Hegde的答案應該可以正常工作。
如果你想使用更多的awk功能來處理每條記錄,比如以某種方式轉換輸出(例如將線條連接在一起等),你可能需要一些不同的東西。
有幾個相當簡單的方法可以做到這一點,但我認爲最好的方法可能是更改記錄分隔符。
使用正則表達式作爲記錄分隔符的能力是一個gawk擴展,但是如果您在Linux上,則可能使用gawk。
這是徒勞無功的程序文件「prog.awk」的內容:
function process_group(name, body) {
print "Got group with name '" name "'";
print body;
}
BEGIN {
RS="(\n|^)\\S+:"
PREV=""
}
{
if (PREV!="") {
process_group(gensub(/\n?(\S+):/, "\\1", "", PREV), $0);
}
PREV=RT
}
您可以運行此使用
gawk -f prog.awk input.txt
或者你可以把整個事情的GAWK命令 - 行,但如果格式良好,則更容易閱讀。
這個想法是,它每次看到記錄分隔符時,都會爲您提供自上次記錄分隔符或文件開頭以來的內容。這意味着它第一次看到記錄分隔符時,它會調用帶有記錄分隔符「foo:」的底部塊和一個空體,第二次它看到記錄分隔符時,它將調用帶有「bar:」的塊並將內容「foo:」和「bar:」等。
這意味着每個塊對應的記錄分隔符是前一個,而不是當前的。通過跟蹤「PREV」變量中的前一個記錄分隔符,這很容易處理。
因此,BEGIN塊設置記錄分隔符RS,並將PREV初始化爲空。
爲每個由RS定界的記錄調用底部的塊,並在文件末尾再次調用。
如果「PREV」不爲空,它將使用當前正文數據和前一個記錄分隔符(通過使用gensub從PREV中刪除不感興趣的位)調用「process_group」函數。然後它將當前匹配的記錄分隔符(RT)分配給PREV以供下次使用。
在「process_group」中,您可以對每個組執行任何處理。在這種情況下,我只是將它們打印出來,但應該很容易修改它以執行任何您想要的操作。
沒有描述輸出應該如何顯示,在代碼塊中顯示。 – Kent
而某種嘗試會很好。 – grail
如果沒有預期的輸出,就很難理解這個問題 – anubhava