[unix] AWK to print field $2 first, then field $1

Here is the input(sample):

[email protected]|com.emailclient.account
[email protected]|com.socialsite.auth.account

I'm trying to achieve this:

Emailclient [email protected]
Socialsite [email protected]

If I use AWK like this:

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}'

it messes up the output by overlaying field 1 on the top of field 2.

Any tips/suggestions? Thank you.

This question is related to unix awk

The answer is


The awk is ok. I'm guessing the file is from a windows system and has a CR (^m ascii 0x0d) on the end of the line.

This will cause the cursor to go to the start of the line after $2.

Use dos2unix or vi with :se ff=unix to get rid of the CRs.


Maybe your file contains CRLF terminator. Every lines followed by \r\n.

awk recognizes the $2 actually $2\r. The \r means goto the start of the line.

{print $2\r$1} will print $2 first, then return to the head, then print $1. So the field 2 is overlaid by the field 1.


Use a dot or a pipe as the field separator:

awk -v FS='[.|]' '{
    printf "%s%s %s.%s\n", toupper(substr($4,1,1)), substr($4,2), $1, $2
}' << END
[email protected]|com.emailclient.account
[email protected]|com.socialsite.auth.account
END

gives:

Emailclient [email protected]
Socialsite [email protected]