You need another logic to do that because of lookahead.
The file is read word by word and not line by line using the LwrGetWord function. You get the left and right contexts by calling LwrGetLeft and LwrGetRight.
--- Lwr.awk ---
BEGIN {
if (WORD == ""

exit ;
if (COL == 0 ) COL = 20 ;
if (CONTEXT == 0 ) CONTEXT = 3 ;
LwrLen = CONTEXT ;
LwrSiz = CONTEXT * 2 + 1 ;
LwrCnt = 0 ;
LwrWrd = 0 ;
LwrFld = 0 ;
}
function LwrGetInput( p) {
while (1) {
if (++LwrFld > NF) {
if (getline <= 0)
$0 = "" ;
LwrFld = 1 ;
}
p = LwrCnt++ % LwrSiz ;
LwrCtx[p] = $LwrFld ;
if (LwrCnt > LwrLen) break ;
}
}
function LwrGetWord( p) {
LwrGetInput() ;
p = LwrWrd++ % LwrSiz ;
return LwrCtx[p] ;
}
function LwrGetLeft( i,lp,lc) {
for (i=LwrLen; i>0; i--) {
lp = (LwrWrd - i + LwrSiz -1) % LwrSiz ;
lc = lc " " LwrCtx[lp] ;
}
sub("^ *","",lc) ;
return lc
}
function LwrGetRight( i,rp,rc) {
for (i=1; i<=LwrLen; i++) {
rp = (LwrWrd + i - 1) % LwrSiz ;
rc = rc LwrCtx[rp] " ";
}
sub(" *$","",rc) ;
return rc
}
{
ll = COL - 1 ;
W = LwrGetWord() ;
while (W != ""

{
if (W == WORD) {
left = LwrGetLeft() " " ;
right = " " LwrGetRight() ;
lleft = length(left)
if (lleft > ll)
left = substr(left, lleft-ll+1) ;
printf "%*s%s%s\n",ll,left,W,right;
}
W = LwrGetWord() ;
}
exit ;
}
--- End of Lwr.awk ---
Call the awk script with the variable définitions :
-v WORD=
word the word you are looking for
-v COL=
col column where to align the word (def=20)
-c CONTEXT=
context size (in words) of left and right contexts
awk -f Lwr.awk -v WORD=the -v CONTEXT=4 file Jean Pierre.