Opsi 1 hingga 3 memiliki masalah dengan banyak spasi (tapi sederhana). Itulah alasan untuk mengembangkan opsi 4 dan 5, yang memproses banyak ruang putih tanpa masalah. Tentu saja, jika opsi 4 atau 5 digunakan dengan n=0
keduanya akan mempertahankan spasi di depan sebagai n=0
cara tidak ada pemisahan.
Pilihan 1
Solusi pemotongan sederhana (bekerja dengan pembatas tunggal):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
pilihan 2
Memaksa penghitungan ulang awk terkadang menyelesaikan masalah (berfungsi dengan beberapa versi awk) dari spasi tambahan yang ditambahkan:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
Opsi 3
Mencetak setiap bidang yang diformat dengan printf
akan memberi lebih banyak kontrol:
$ 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
Namun, semua jawaban sebelumnya mengubah semua FS antar bidang menjadi OFS. Mari kita buat beberapa solusi untuk itu.
Pilihan 4
Perulangan dengan sub untuk menghapus bidang dan pembatas lebih portabel, dan tidak memicu perubahan FS menjadi 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
CATATAN: The "^ [" FS "] *" untuk menerima masukan dengan spasi di depan.
Pilihan 5
Sangat mungkin untuk membangun solusi yang tidak menambahkan spasi tambahan di depan atau di belakang, dan mempertahankan spasi kosong yang ada menggunakan fungsi gensub
dari GNU awk, karena ini:
$ 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
Ini juga dapat digunakan untuk menukar daftar bidang dengan hitungan 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 !
Tentu saja, dalam kasus seperti itu, OFS digunakan untuk memisahkan kedua bagian garis, dan ruang putih di belakang bidang masih dicetak.
Note1: ["FS"]*
digunakan untuk memungkinkan spasi di baris input.
cut -f3-
?