AWK to print field $2 first, then field $1

后端 未结 4 1030
时光取名叫无心
时光取名叫无心 2020-12-12 20:33

Here is the input(sample):

name1@gmail.com|com.emailclient.account
name2@msn.com|com.socialsite.auth.account

I\'m trying to achieve this:

相关标签:
4条回答
  • 2020-12-12 21:15

    A couple of general tips (besides the DOS line ending issue):

    cat is for concatenating files, it's not the only tool that can read files! If a command doesn't read files then use redirection like command < file.

    You can set the field separator with the -F option so instead of:

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

    Try:

    awk -F'|' '{print $2" "$1}' foo 
    

    This will output:

    com.emailclient.account name1@gmail.com
    com.socialsite.auth.accoun name2@msn.com
    

    To get the desired output you could do a variety of things. I'd probably split() the second field:

    awk -F'|' '{split($2,a,".");print a[2]" "$1}' file
    emailclient name1@gmail.com
    socialsite name2@msn.com
    

    Finally to get the first character converted to uppercase is a bit of a pain in awk as you don't have a nice built in ucfirst() function:

    awk -F'|' '{split($2,a,".");print toupper(substr(a[2],1,1)) substr(a[2],2),$1}' file
    Emailclient name1@gmail.com
    Socialsite name2@msn.com
    

    If you want something more concise (although you give up a sub-process) you could do:

    awk -F'|' '{split($2,a,".");print a[2]" "$1}' file | sed 's/^./\U&/'
    Emailclient name1@gmail.com
    Socialsite name2@msn.com
    
    0 讨论(0)
  • 2020-12-12 21:16

    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
    name1@gmail.com|com.emailclient.account
    name2@msn.com|com.socialsite.auth.account
    END
    

    gives:

    Emailclient name1@gmail.com
    Socialsite name2@msn.com
    
    0 讨论(0)
  • 2020-12-12 21:17

    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.

    0 讨论(0)
  • 2020-12-12 21:37

    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.

    0 讨论(0)
提交回复
热议问题