GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memotong n kolom pertama dan n terakhir?

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-

Linux
  1. Bagaimana Cara Menggunakan Awk Untuk Mencetak Hanya Garis yang Berisi 5 Kolom?

  2. Bekerja Dengan Kolom – Awk Dan Sed?

  3. Potong / Grep Dan Df -h?

  1. Cara:Replikasi dan Konfigurasi DRBD

  2. Bagaimana cara mencetak kolom ketiga ke kolom terakhir?

  3. Menggunakan awk untuk mencetak semua kolom dari n ke yang terakhir

  1. Cara Menggunakan Awk dan Ekspresi Reguler untuk Memfilter Teks atau String dalam File

  2. Bagaimana cara Menghapus baris 'n' Pertama/Terakhir dari output perintah di Shell?

  3. Cara menemukan bidang terakhir menggunakan 'potong'