
文件:
data
A B
C D
data
E F
G H
data
I J
K L
M N
想要的結果:
I J
K L
M N
如何按「資料」拆分?我一直在google上搜尋如何使用awk,但是大多數相對的awk都是拆分列的。
答案1
用作data
記錄分隔符號並列印最後一筆記錄:
$ awk -v RS=data 'END{print}' File
I J
K L
M N
這需要 awk,例如 GNU awk (gawk) 或 mawk,支援 的多重字元值RS
。
答案2
$ awk '/^data/ { lines = ""; next } { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
I J
K L
M N
這用於awk
獲取以 string 開頭的最後一行之後的輸入內容data
。這是透過將一行之後的每一行保存到lines
變數中來完成的。每次data
遇到以 開頭的行時,該變數都會被清空。當到達輸入末端時,將列印變數的值。
使用sed
:
$ sed -n 'H;${ x; s/.*\ndata\n//p; }' file
I J
K L
M N
我們將所有行新增到保留空間。當遇到最後一行時,保留空間被交換到模式空間中,並且在列印剩餘位元之前刪除字串data
(兩側各有一個換行符)之前的所有內容。
使用ed
:
$ printf "?^data?ka\n1,'ad\n,p\nQ\n" | ed -s file
I J
K L
M N
或者,
ed -s file <<END_ED
?^data?ka
1,'ad
,p
Q
END_ED
在這裡,我們首先向後搜尋字串data
在行開頭的最後一次出現,並為該行添加標籤(我們稱之為標籤a
)。然後我們從緩衝區的開頭刪除到標記行。只是,p
輸出緩衝區的全部內容。
對於非 GNU ,可能不需要ed
最後的(退出而不儲存)。Q
答案3
若要按「資料」而非換行符號分割記錄,請設定 RS(記錄分隔符號)變數。
您只對第四筆記錄感興趣(第一筆記錄在第一個「資料」之前;它是空的),因此只有在 NR 為 4 時才列印。
cat file | awk 'BEGIN {RS="data\n"}; NR==4 {print}'
答案4
透過以下方法完成,效果很好指令:
tac file.txt|sed -n '1,/data/p'| tac| sed -n '2,$p'
輸出
I J
K L
M N