2013-03-24 48 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

相關問題