Điều này đơn giản, ngắn gọn và dễ viết, hiểu và kiểm tra, và cá nhân tôi thích nó:
grep -oE '\S+$' file
grep
trong Ubuntu , khi được gọi bằng -E
hoặc -P
, lấy tốc ký \s
có nghĩa là một ký tự khoảng trắng (trong thực tế thường là một khoảng trắng hoặc tab) và \S
có nghĩa là bất cứ thứ gì không phải là một. Sử dụng bộ định lượng+
và neo cuối dòng$
, mẫu \S+$
khớp với một hoặc nhiều khoảng trống ở cuối dòng . Bạn có thể sử dụng -P
thay vì -E
; ý nghĩa trong trường hợp này là giống nhau nhưng một công cụ biểu thức chính quy khác được sử dụng, vì vậy chúng có thể có các đặc tính hiệu suất khác nhau .
Điều này tương đương với giải pháp nhận xét của Avinash Raj (chỉ với một cú pháp gọn hơn, dễ dàng hơn):
grep -o '[^[:space:]]\+$' file
Các phương pháp này sẽ không hoạt động nếu có thể có khoảng trắng sau số. Họ có thể được sửa đổi để họ làm, nhưng tôi thấy không có điểm nào để đi vào đó ở đây. Mặc dù đôi khi hướng dẫn để khái quát hóa một giải pháp để làm việc trong nhiều trường hợp, nhưng nó không thực tế để làm như vậy thường xuyên như mọi người thường nghĩ, bởi vì người ta thường không có cách nào để biết trong số nhiều cách không tương thích khác nhau mà vấn đề cuối cùng có thể cần phải làm được khái quát.
Hiệu suất đôi khi là một cân nhắc quan trọng. Câu hỏi này không quy định rằng đầu vào rất lớn và có thể mọi phương pháp đã được đăng ở đây là đủ nhanh. Tuy nhiên, trong trường hợp tốc độ là mong muốn, đây là một điểm chuẩn nhỏ trên tệp đầu vào mười triệu dòng:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
Tôi đã chạy nó hai lần trong trường hợp thứ tự có vấn đề (vì đôi khi nó làm cho các nhiệm vụ nặng / nặng) và vì tôi không có sẵn máy mà không làm những thứ khác trong nền có thể làm lệch kết quả. Từ những kết quả đó, tôi kết luận như sau, ít nhất là tạm thời và cho các tệp đầu vào có kích thước tôi đã sử dụng:
Ồ Vượt qua -P
(để sử dụng PCRE ) thay vì -G
(mặc định khi không có phương ngữ nào được chỉ định) hoặc -E
được thực hiện grep
nhanh hơn bằng một thứ tự cường độ. Vì vậy, đối với các tệp lớn, có thể sử dụng lệnh này tốt hơn so với lệnh được hiển thị ở trên:
grep -oP '\S+$' file
Ôi !! Các cut
phương pháp trong câu trả lời của αғsнιη , , xuất hiện nhiều theo độ nhanh hơn ngay cả những phiên bản nhanh hơn của con đường của tôi! Đó cũng là người chiến thắng trong điểm chuẩn của pa4080 , bao gồm nhiều phương thức hơn phương pháp này nhưng với đầu vào nhỏ hơn - và đó là lý do tại sao tôi chọn nó, trong tất cả các phương pháp khác, để đưa vào thử nghiệm của tôi. Nếu hiệu suất là quan trọng hoặc các tệp rất lớn, tôi nghĩ nên sử dụng phương pháp của αsнι .cut -d= -f2 file
cut
Điều này cũng đóng vai trò như một lời nhắc nhở rằng không nên quên các tiện ích đơn giản cut
và paste
tiện ích và có lẽ nên được ưu tiên khi áp dụng, mặc dù có những công cụ tinh vi hơn như grep
thường được cung cấp dưới dạng giải pháp hàng đầu (và cá nhân tôi quen hơn đối với việc sử dụng).
grep -o '[^[:space:]]\+$' file