2013-03-24 86 views

回答

41

一对夫妇一般提示的(除了DOS行结束的问题)

cat是串联的文件,这是不是一个可以读取文件的唯一工具!如果某个命令不读取文件,则使用重定向,如​​。

您可以设置与-F选项字段分隔所以不是:

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

尝试:

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

这将输出:

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

以获得所需的输出你可以做很多事情。我可能会split()第二场:

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file 
emailclient [email protected] 
socialsite [email protected] 

最后拿到的第一个字符转换为大写是awk有点痛的,你没有一个很好的内置ucfirst()功能:

awk -F'|' '{split($2,a,".");print toupper(substr(a[2],1,1)) substr(a[2],2),$1}' file 
Emailclient [email protected] 
Socialsite [email protected] 

如果你想要的东西更简洁(虽然你放弃了一个子进程)你可以这样做:

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file | sed 's/^./\U&/' 
Emailclient [email protected] 
Socialsite [email protected] 
+2

谢谢,这也是*非常有用! – Sazzy 2013-03-24 16:31:42

1

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

这会使光标移到$ 2后面的行首。

使用dos2unix或vi与:se ff=unix来摆脱CR。

+0

每行都以0x0d0a结尾,那是你的意思吗?削减这些十六进制值是否可以解决问题? Thx – Sazzy 2013-03-24 11:33:58

+0

0a是好的,刚摆脱0d – parkydr 2013-03-24 11:42:09

+0

谢谢!将以下内容添加到管道中,对问题进行了排序:| sed's/\ x0d // g'| – Sazzy 2013-03-24 12:01:09

3

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

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 

给出:

Emailclient [email protected] 
Socialsite [email protected] 
+2

这是我最初的想法,但'.co.uk','.cam.ac.uk'等等变得混乱。 – 2013-03-24 19:48:04

0

也许你的文件包含CRLF终止。

每行后跟\ r \ n。 awk确认$ 2实际上是$ 2 \ r。 \ r意味着开始行。

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

+0

欢迎来到Stack Overflow,SleepyProgrammer!如果可以,我建议您添加更多细节。这篇文章看起来像一条评论,可能会被删除... – Badacadabra 2017-06-27 17:33:26