Đường ống này nhanh hơn câu trả lời nhanh nhất khác bởi một yếu tố quan trọng (xem kết quả). Nó sử dụng tr
và tac
. Nó không cần sử dụng 2 byte ASCII (\ x00- \ x7F) không tồn tại trong dữ liệu của bạn.
\x00
thường là một lựa chọn tốt \x01
, nhưng bạn có thể sử dụng bất kỳ byte ASCII nào không có trong dữ liệu.
Trong ví dụ này, SPACE và TAB là các ký tự phân cách. Dấu phân cách có thể là nhiều byte hoặc đơn. Dấu phân cách đầu ra là một khoảng trắng.
Đây là lệnh. Tên tệp hiển thị numberof fields
_xnumber of lines
<"$file" tr ' \t\n' '\0\0\1' |tr -s '\0' '\n' |tac |tr '\n' ' ' |tr '\1' '\n'
Nếu bạn muốn / cần kiểm tra các byte không sử dụng, bạn có thể kiểm tra trước với awk
tập lệnh tùy chọn này . Tổng thời gian, ngay cả khi chạy tập lệnh tùy chọn này, vẫn nhanh hơn đáng kể so với các metod khác (cho đến nay :) .. Đây là tập lệnh tiền xử lý.
o=($(<"$file" char-ascii-not-in-stream)); x="${o[0]}"; y="${o[1]}"
<"$file" tr ' \t\n' "$x$x$y" |tr -s "$x" '\n' |tac |tr '\n' ' ' | tr '$y' '\n' >"$file".$user
Đây là kịch bản awk: char-ascii-not-in-stream
#!/usr/bin/awk -f
{c[$0]} END{for(i=0;i<=127;i++) {if(sprintf("%c", i) in c);else {printf "\\%03o ",i}}}
Nhóm lần thứ hai, đối với tập lệnh này, bao gồm char-ascii-not-in-stream
thời gian.
Peter.O {tr,tac,tr} ==== file_10_x10000
real 0m0.013s 0m0.015s
user 0m0.020s 0m0.020s
sys 0m0.008s 0m0.012s
user11136 {python} ===== file_10_x10000
real 0m0.057s
user 0m0.048s
sys 0m0.008s
jmp {python} =========== file_10_x10000
real 0m0.160s
user 0m0.160s
sys 0m0.000s
rush {awk} ============= file_10_x10000
real 0m0.121s
user 0m0.120s
sys 0m0.000s
##############################################
Peter.O {tr,tac,tr} ==== file_1000_x1000
real 0m0.048s 0m0.059s
user 0m0.040s 0m0.040s
sys 0m0.040s 0m0.048s
user11136 {python} ===== file_1000_x1000
real 0m0.158s
user 0m0.136s
sys 0m0.028s
jmp {python} =========== file_1000_x1000
real 0m0.327s
user 0m0.320s
sys 0m0.008s
rush {awk} ============= file_1000_x1000
real 0m0.832s
user 0m0.820s
sys 0m0s012s
##############################################
Peter.O {tr,tac,tr} ==== file_1000000_x50
real 0m5.221s 0m6.458s
user 0m4.208s 0m5.248s
sys 0m2.624s 0m2.396s
user11136 {python} ===== file_1000000_x50
real 0m16.286s
user 0m10.041s
sys 0m5.148s
jmp {python} =========== file_1000000_x50
real 0m22.845s
user 0m20.705s
sys 0m1.140s
rush {awk} ============= file_1000000_x50
real 0m44.793s
user 0m43.583s
sys 0m0.848s
##############################################
perl -lane 'print join " ", reverse @F'