2013-03-24 23 views
21

Dưới đây là đầu vào (mẫu):

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

Tôi đang cố gắng để đạt được điều này:

Emailclient [email protected] 
Socialsite [email protected] 

Nếu tôi sử dụng AWK như thế này:

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

nó messes lên đầu ra bằng cách phủ lĩnh vực 1 trên đỉnh của lĩnh vực 2.

Bất kỳ mẹo/đề xuất nào? Cảm ơn bạn.

Trả lời

41

Một vài lời khuyên chung (bên cạnh dòng vấn đề kết thúc DOS):

cat là dành cho concatenating file, nó không phải là công cụ duy nhất có thể đọc các tập tin! Nếu lệnh không đọc tệp thì hãy sử dụng chuyển hướng như command < file.

Bạn có thể đặt tách lĩnh vực với các tùy chọn -F nên thay vì:

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

Hãy thử:

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

Sản lượng này sẽ:

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

Để có được kết quả mong muốn bạn có thể làm nhiều thứ. Tôi muốn có lẽ split() trường thứ hai:

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

Cuối cùng để có được những nhân vật đầu tiên chuyển đổi sang chữ hoa là một chút của một cơn đau ở awk như bạn không có một tốt đẹp được xây dựng trong ucfirst() chức năng:

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

Nếu bạn muốn một cái gì đó ngắn gọn hơn (mặc dù bạn từ bỏ một tiểu trình) bạn có thể làm:

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

Cảm ơn bạn, đó là * rất * hữu ích là tốt! – Sazzy

1

Vụng về là ok. Tôi đoán các tập tin là từ một hệ thống cửa sổ và có một CR (^ m ascii 0x0d) vào cuối dòng.

Điều này sẽ khiến con trỏ chuyển đến đầu dòng sau $ 2.

Sử dụng dos2unix hoặc vi với :se ff=unix để loại bỏ CR.

+0

mỗi dòng kết thúc bằng 0x0d0a, đó là ý của bạn? Việc cắt giảm các giá trị hex này sẽ giải quyết được vấn đề? Thx – Sazzy

+0

Các 0a là ok, chỉ cần thoát khỏi 0d – parkydr

+0

Cảm ơn! Thêm những thứ sau vào đường ống đã sắp xếp vấn đề: | sed 's/\ x0d // g' | – Sazzy

3

Sử dụng một dấu chấm hoặc một ống để tách các lĩnh vực:

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 

cho:

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

Đây là suy nghĩ ban đầu của tôi nhưng những gì về '.co.uk',' .cam.ac.uk', vv .. trở nên lộn xộn. –

0

Có lẽ tập tin của bạn chứa CRLF terminator.

Mọi dòng được theo sau bởi \ r \ n. awk nhận ra $ 2 thực sự là $ 2 \ r. \ R có nghĩa là goto bắt đầu của dòng.

{print $ 2 \ r $ 1} sẽ in $ 2 trước, sau đó quay lại đầu, sau đó in $ 1. Vì vậy, trường 2 được phủ bởi trường 1.

+0

Chào mừng bạn đến với Stack Overflow, SleepyProgrammer! Tôi khuyên bạn nên thêm nhiều chi tiết hơn nếu bạn có thể. Bài đăng này trông giống như nhận xét và có thể bị xóa ... – Badacadabra

Các vấn đề liên quan