I have a text file that has blocks of consecutive non empty lines separated by a blank line. I want to join the lines in a block (similar to the J key in the vi editor). Here  I found the following script by cfajohnson, that does the job:awk 'BEGIN { RS = ; OFS =  }           {$1 = $1; print }'so processing the filehello    worldthis    is  anotherlinegiveshello worldthis is another line(On two Solaris machines (SunOS 5.11 11.1 and SunOS 5.10 Generic_147440-16)  I get a segmentation fault when the blocks were separated by three or more empty lines. On Linux it works also if they are separated by two or more lines)From the manual of awk (Linux): Assigning a value to an existing field causes  the whole record to be rebuilt when $0 is referenced....OFS         The output field separator, a space by default....RS          The input record separator, by default a newline.It seems that the script also works if one omits the RS= statement in the BEGIN-block (blank is the default value of RS)I don't understand why this script joins the lines, remove leading and trailing whitspace.Can anybody explain how this script works?
mysterious awk script joins lines
awk
You may omit the OFS=  I think, but the RS= (or equivalent) is essential in order to put awk into paragraph mode.From the GNU awk manual, 4.8 Multiple-Line Records (other awks behave similarly, AFAIK):Another technique is to have blank lines separate records. By a  special dispensation, an empty string as the value of RS indicates  that records are separated by one or more blank lines. When RS is set  to the empty string, each record always ends at the first blank line  encountered. The next record doesnt start until the first nonblank  line that follows. No matter how many blank lines appear in a row,  they all act as one record separator. (Blank lines must be completely  empty; lines that contain only whitespace do not count.)In this mode, fields are still separated on whitespace by default, but whitespace now includes (single) newlines. The default output field separator is a single space, so all that's required to turn each multi-line record into a single line of space-separated fields is to force awk to rebuild the record variable $0, which is achieved as a side-effect of the assignment $1=$1  - see for example Famous Awk One-Liners Explained, Part II: Text Conversion and Substitution, 27. Delete both leading and trailing whitespaces from each line (trim).