The awk script:
awk 'BEGIN {FS = OFS = "|" }
{ match($2, /P.. /)
f2 = " " substr($2, RSTART, RLENGTH)
match($2, / Q../)
f3 = substr($2, RSTART, RLENGTH) " "
match($2, /E.. /)
f4 = " " substr($2, RSTART, RLENGTH - 1)
print $1, f2, f3, f4
}' Sample2.txt
starts by setting the input and output field separators (FS and OFS) to the <vertical-line> (or pipe) character. So, with your sample data, the 2nd field in each input line always begins with a <space> character.
The match() calls search the string specified by the first argument (in all three cases this is the 2nd field in an input line) for the extended regular expression specified by the 2nd argument, returns the index in that string where the 1st match occurs (or 0 if there is no match) and sets RSTART to the same value. If RSTART is not zero, RLENGTH is set to the length of the substring that matches the ERE. The substring EREs given to these three calls to match() search for a P followed by any two characters followed by a space, for a space followed by a Q followed by any two characters, and for an E followed by any two characters followed by a space character, respectively. (Note that with these EREs, three letter strings found at the end of the line will not be matched since there is no trailing space in those cases; but your requirements explicitly stated that the match was to be to a following space. Note also that if some of your input lines do not have matches for all three of your specified conditions, the results are unspecified and there will be no warning that something didn't match. If this is a concern, you should check the return code from match() and print a diagnostic message if it returns 0.)
The following calls to substr() use the values of RSTART and RLENGTH set by match() to extract the desired output fields (with added leading or trailing spaces) to set f2, f3, and f4 to be the desired 2nd, 3rd, and 4th output fields, respectively.
Note that RLENGTH - 1 is used in the last substr() to eliminate the unwanted trailing space that would appear at the end of the line if RLENGTH had been used instead. With all of the EREs used in these match() calls, RLENGTH will always be 4, but I kept RLENGTH and RLENGTH - 1 rather than 4 and 3 in case you later decide to change the EREs to match different strings.
With OFS set to "|", the print call adds the specified field separators when printing the output lines.