Awk

我可以從這些數據中提取第 n 個“塊”嗎?

  • January 5, 2021

我有stdout很多看起來像這樣的文本塊:

% QUESTION
Who played drums for The Beatles?


% QUESTION
Who played
guitar

for The Beatles?


% QUESTION
Who played

bass for The Beatles

?

這裡的想法是將文件分成“塊”,每個塊都以行開頭% QUESTION。我想編寫一個腳本來列印該數據的第 n 塊。

例如,發行nthchunk 3應該列印

Who played

bass for The Beatles

?

我怎麼能這樣做呢?

使用awk支持正則表達式作為記錄分隔符 ( RS) 的實現,例如 GNU awk,您可以執行以下操作:

awk -v n=3 -v RS='(\n+|^)% QUESTION\n' 'NR == n+1 {print; exit}' < questions.txt

GNU sed採用擴展的正則表達式模式-E將用於解決這個問題。基本思想是在模式空間中累積連續的 % 問題行和其間的行。而計數器作為一串點保存在保持空間中。

chunk=2
sed -E ':loop
 /%/,/%/N
 /%.*%/!{
   /%/!d;$!bloop
   s/$/\nfiller/
 }
 G;s/$/./
 /\n[.]{'"${chunk}"'}$/bend
 h;s/.*\n//;x
 s/.*(\n.*)\n.*$/\1/;D
 :end
 s/^[^\n]*\n+(\S.*\S)(\n.*){2}$/\1/
 q
' file

或者,在 slurp 模式下 perl 將 FS 設置為問題行。數組@F 的元素應該是塊。

perl \
 -F'/(?:^|\n+)\%\h+QUESTION\n+/' \
 -pals -0777 \
 -e '$_=$F[$n]' \
-- -n="${chunk}" ./file;

輸出:

Who played
guitar

for The Beatles?

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