Một đơn giản, mặc dù awk-less giải pháp trong bấu víu:
while IFS=, read -r a a a b; do echo "$a"; done <inputfile
Nó hoạt động nhanh hơn đối với các tệp nhỏ (<100 dòng) sau đó awkvì nó sử dụng ít tài nguyên hơn (tránh gọi các cuộc gọi hệ thống fork
và đắt tiền execve
).
CHỈNH SỬA từ Ed Morton (xin lỗi vì đã đánh cắp câu trả lời, tôi không biết có cách nào tốt hơn để giải quyết vấn đề này không):
Để giải quyết huyền thoại rằng shell sẽ chạy nhanh hơn awk cho các tệp nhỏ:
$ wc -l file
99 file
$ time while IFS=, read -r a a a b; do echo "$a"; done <file >/dev/null
real 0m0.016s
user 0m0.000s
sys 0m0.015s
$ time awk -F, '{print $3}' file >/dev/null
real 0m0.016s
user 0m0.000s
sys 0m0.015s
Tôi hy vọng nếu bạn nhận được một tệp REALY đủ nhỏ thì bạn sẽ thấy tập lệnh shell chạy nhanh hơn tập lệnh awk trong một tích tắc nhưng ai quan tâm?
Và nếu bạn không tin rằng khó viết các tập lệnh shell mạnh mẽ hơn các script awk, hãy xem lỗi này trong tập lệnh shell mà bạn đã đăng:
$ cat file
a,b,-e,d
$ cut -d, -f3 file
-e
$ awk -F, '{print $3}' file
-e
$ while IFS=, read -r a a a b; do echo "$a"; done <file
$
awk
? IMHO đây là một vấn đề rất đơn giản. Bạn có bất kỳ tham dự để giải quyết nó?