ไปป์ไลน์นี้เร็วกว่าคำตอบอื่น ๆ ที่เร็วที่สุดโดยปัจจัยสำคัญ (ดูผลลัพธ์) มันใช้และtr
tac
จำเป็นต้องใช้ 2 ASCII ไบต์ (\ x00- \ x7F) ซึ่งไม่มีอยู่ในข้อมูลของคุณ
\x00
โดยทั่วไปแล้วเป็นตัวเลือกที่ดีตามที่เป็นอยู่\x01
แต่คุณสามารถใช้ ASCII ไบต์ใดก็ได้ที่ไม่ได้อยู่ในข้อมูล
ในตัวอย่างนี้ SPACE และ TAB เป็นอักขระตัวคั่น ตัวคั่นสามารถเป็นแบบหลายไบต์หรือเดี่ยว ตัวคั่นเอาต์พุตเป็นพื้นที่เดียว
นี่คือคำสั่ง ชื่อไฟล์จะแสดงnumberof fields
_xnumber of lines
<"$file" tr ' \t\n' '\0\0\1' |tr -s '\0' '\n' |tac |tr '\n' ' ' |tr '\1' '\n'
หากคุณต้องการ / จำเป็นต้องตรวจสอบไบต์ที่ไม่ได้ใช้งานคุณสามารถตรวจสอบล่วงหน้าด้วยawk
สคริปต์ตัวเลือกนี้ เวลาโดยรวมแม้เมื่อเรียกใช้สคริปต์ตัวเลือกนี้ยังคงเร็วกว่า metod อื่น ๆ (จนถึงตอนนี้ :) .. นี่คือสคริปต์การประมวลผลล่วงหน้า
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
นี่คือสคริปต์ 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}}}
สำหรับชุดที่สองของเวลานี้รวมถึงchar-ascii-not-in-stream
เวลาของสคริปต์ด้วย
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'