Cut dapat mengambil beberapa rentang di -f
:
Kolom hingga 4 dan dari 7 dan seterusnya:
cut -f -4,7-
atau untuk bidang 1,2,5,6 dan dari 10 dan seterusnya:
cut -f 1,2,5,6,10-
dll
Bagian pertama dari pertanyaan Anda mudah. Seperti yang telah ditunjukkan, cut menerima penghilangan indeks awal atau indeks akhir rentang kolom, menafsirkannya sebagai "dari awal ke kolom n (inklusif)” atau “dari kolom n (inklusif) sampai akhir,” masing-masing:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
Ini juga mendukung penggabungan rentang. Jika Anda ingin, misalnya, 3 kolom pertama dan 2 kolom terakhir dalam baris 7 kolom:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
Namun, bagian kedua dari pertanyaan Anda bisa sedikit lebih rumit tergantung pada masukan seperti apa yang Anda harapkan. Jika dengan “terakhir n kolom” maksud Anda “n terakhir kolom (terlepas dari indeksnya di baris keseluruhan)” (yaitu karena Anda belum tentu tahu berapa banyak kolom yang akan Anda temukan sebelumnya) maka sayangnya hal ini tidak mungkin dilakukan dengan menggunakan cut
sendiri. Untuk menggunakan cut
secara efektif untuk menarik “n terakhir kolom” di setiap baris, jumlah total jumlah kolom yang ada di setiap baris harus diketahui terlebih dahulu, dan setiap baris harus konsisten dalam jumlah kolom yang dikandungnya.
Jika Anda tidak tahu berapa banyak "kolom" yang mungkin ada di setiap baris (misalnya karena Anda bekerja dengan masukan yang tidak sepenuhnya tabular), maka Anda harus menggunakan sesuatu seperti awk
alih-alih. Misalnya, untuk menggunakan awk
untuk mengeluarkan 2 "kolom" terakhir (awk menyebutnya bidang, yang jumlahnya dapat bervariasi per baris) dari setiap baris masukan:
$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d
Untuk menggunakan AWK untuk memotong kolom pertama dan terakhir:
awk '{$1 = ""; $NF = ""; print}' inputfile
Sayangnya, itu menyisakan pemisah bidang, jadi
aaa bbb ccc
menjadi
[space]bbb[space]
Untuk melakukan ini menggunakan jawaban kurumi yang tidak akan meninggalkan ruang ekstra, tetapi dengan cara yang spesifik untuk kebutuhan Anda:
awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
Ini juga memperbaiki beberapa masalah dalam jawaban itu.
Untuk menggeneralisasi itu:
awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
Kemudian Anda dapat mengubah jumlah bidang yang akan dilewati di awal atau di akhir dengan mengubah penetapan variabel di awal perintah.
Anda dapat memotong menggunakan berikut,
-d:pembatas ,-f untuk bidang
\t digunakan untuk bidang yang dipisahkan tab
cut -d$'\t' -f 1-3,7-