Read a crossword
Pyth - 11 10 8 7 bytes
saved one bytes thanks to @issacg.
t#cjsCB
Try it online here.
t# Filter by if len > 1
c Chop by whitespace by default
j Join by newlines
sCB Input, implicit and its transpose in one list
CJam, 14 bytes
{_z+S*S%{,(},}
An unnamed block that expects a list of (padded) strings on top of the stack and leaves a list of words instead.
Test it here.
Explanation
_z e# Duplicate and transpose the grid.
+ e# Append the transpose to the original grid.
S* e# Join all lines by spaces to ensure that we don't get words
e# spanning multiple lines.
S% e# Split around spaces, discarding empty segments.
{,(}, e# Filter: keep only those strings with length 2 or greater.
05AB1E, 9 bytes
ø«€#J˜ʒ¦Ā
Input as a character matrix.
Try it online or verify all test cases.
Explanation:
ø # Zip/transpose the (implicit) input-matrix; swapping rows/columns
« # Merge this list of lists to the (implicit) input list of lists
€ # For each inner list:
# # Split them on spaces
J # Join each innermost list together to a single string
˜ # Flatten the entire list
ʒ # Filter the strings by:
¦ # Remove the first character of the string (no-op if it's already empty)
Ā # And check that it's non-empty
# (after which the result is output implicitly)