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