Unix AWK先打印字段$2,然后打印字段$1

Unix AWK先打印字段$2,然后打印字段$1,unix,awk,Unix,Awk,以下是输入(示例): 我正在努力做到这一点: Emailclient name1@gmail.com Socialsite name2@msn.com 如果我像这样使用AWK: cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}' 它将字段1叠加在字段2的顶部,从而使输出混乱 有什么建议吗?谢谢。awk还可以。我猜该文件来自windows系统,并且在行尾有一个CR(^m ascii 0x0d) 这将导致光标移到$2之后的行的开头 将dos2unix或

以下是输入(示例):

我正在努力做到这一点:

Emailclient name1@gmail.com
Socialsite name2@msn.com
如果我像这样使用AWK:

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}'
它将字段1叠加在字段2的顶部,从而使输出混乱


有什么建议吗?谢谢。

awk还可以。我猜该文件来自windows系统,并且在行尾有一个CR(^m ascii 0x0d)

这将导致光标移到$2之后的行的开头

将dos2unix或vi与
:se ff=unix
一起使用,以摆脱CRs。

除了DOS行结束问题外,还有几个一般提示:

cat
用于连接文件,它不是唯一可以读取文件的工具!如果命令不读取文件,则使用重定向,如
command

您可以使用
-F
选项设置字段分隔符,而不是:

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

这将输出:

com.emailclient.account name1@gmail.com
com.socialsite.auth.accoun name2@msn.com
为了得到想要的输出,你可以做很多事情。我可能会
split()
第二个字段:

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file
emailclient name1@gmail.com
socialsite name2@msn.com
最后,要将第一个字符转换为大写,在
awk
中有点麻烦,因为您没有一个好的内置
ucfirst()
函数:

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
如果您想要更简洁的东西(尽管您放弃了子流程),您可以:

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

使用点或管道作为字段分隔符:

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

也许你的文件包含CRLF终止符。每行后面跟着\r\n

awk
识别
$2
实际上
$2\r
\r
表示转到行的开头


{print$2\r$1}
将首先打印
$2
,然后返回头部,然后打印
$1
。因此,字段2被字段1覆盖。

每行以0x0d0a结尾,这是您的意思吗?切割这些十六进制值能解决问题吗?那0a没问题,把0D手帕扔了吧!将以下内容添加到管道中解决了问题:| sed's/\x0d//g'|谢谢,这也非常有用!这是我最初的想法,但是关于
.co.uk
.cam.ac.uk
,等等。。变得凌乱。欢迎使用堆栈溢出,SleepyProgrammer!如果可以,我建议您添加更多详细信息。此帖子看起来像一条评论,可能会被删除。。。
awk -F'|' '{split($2,a,".");print a[2]" "$1}' file | sed 's/^./\U&/'
Emailclient name1@gmail.com
Socialsite name2@msn.com
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
Emailclient name1@gmail.com
Socialsite name2@msn.com