ตัวเลือก 1 ถึง 3 มีปัญหาเกี่ยวกับช่องว่างหลายช่อง (แต่ทำได้ง่าย) นั่นคือเหตุผลในการพัฒนาตัวเลือก 4 และ 5 ซึ่งประมวลผลช่องว่างสีขาวหลายช่องโดยไม่มีปัญหา แน่นอนว่าหากใช้ตัวเลือก 4 หรือ 5 กับn=0
ทั้งสองจะคงช่องว่างที่นำหน้าไว้เป็นn=0
ไม่มีการแยก
ตัวเลือกที่ 1
วิธีการตัดอย่างง่าย (ใช้ได้กับตัวคั่นเดี่ยว):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
ทางเลือกที่ 2
การบังคับให้คำนวณใหม่ awk บางครั้งแก้ปัญหาได้ (ใช้ได้กับ awk บางเวอร์ชัน) ของช่องว่างชั้นนำที่เพิ่ม:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
ตัวเลือก 3
การพิมพ์แต่ละฟิลด์ที่มีรูปแบบprintf
จะให้การควบคุมมากขึ้น:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }'
4 5 6 7 8
อย่างไรก็ตามคำตอบก่อนหน้านี้ทั้งหมดเปลี่ยน FS ทั้งหมดระหว่างฟิลด์เป็น OFS ลองสร้างวิธีแก้ปัญหาสองสามข้อ
ทางเลือกที่ 4
ลูปที่มี sub เพื่อลบฟิลด์และตัวคั่นนั้นพกพาได้มากกว่าและไม่ทำให้เกิดการเปลี่ยนแปลง FS เป็น OFS:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for(i=1;i<=n;i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 '
4 5 6 7 8
บันทึก: "^ [" FS "] *" คือการยอมรับอินพุตที่มีช่องว่างนำหน้า
ทางเลือกที่ 5
ค่อนข้างเป็นไปได้ที่จะสร้างโซลูชันที่ไม่เพิ่มช่องว่างที่นำหน้าหรือต่อท้ายและรักษาช่องว่างที่มีอยู่โดยใช้ฟังก์ชันgensub
จาก GNU awk ดังนี้:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4 5 6 7 8
นอกจากนี้ยังอาจใช้เพื่อสลับรายการเขตข้อมูลที่ได้รับการนับn
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ a=gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1);
b=gensub("^(.*)("a")","\\1",1);
print "|"a"|","!"b"!";
}'
|4 5 6 7 8 | ! 1 2 3 !
แน่นอนในกรณีเช่นนี้ OFS จะใช้เพื่อแยกทั้งสองส่วนของบรรทัดและยังคงพิมพ์ช่องว่างด้านหลังของฟิลด์
Note1: ["FS"]*
ใช้เพื่อให้ช่องว่างนำหน้าในบรรทัดอินพุต
cut -f3-
ไม่ได้?