Apa yang merupakan 'bidang' untuk perintah cut?


16

Sebagai contoh, cutperintah dapat mengambil parameter -f, yang sesuai denganman

pilih saja bidang ini; juga mencetak setiap baris yang tidak mengandung karakter pembatas, kecuali opsi -s ditentukan

Dalam konteks ini, apa itu bidang?

Jawaban:


19

Istilah "bidang" sering kali dikaitkan dengan alat seperti cutdan awk. Bidang akan serupa dengan kolom yang bernilai data, jika Anda mengambil data dan memisahkannya menggunakan karakter tertentu. Biasanya karakter yang digunakan untuk melakukan ini adalah a Space.

Namun seperti halnya dengan sebagian besar alat, ini dapat dikonfigurasi. Sebagai contoh:

  • awk = awk -F"," ...- akan dipisahkan oleh koma (yaitu ,).
  • cut = cut -d"," ...- akan dipisahkan dengan koma (yaitu ,).

Contohnya

Yang pertama ini menunjukkan bagaimana awksecara otomatis akan membagi ruang.

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Ini menunjukkan bagaimana cutakan membagi ruang juga.

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.

Di sini kami memiliki daftar CSV data kolom yang kami gunakan cutuntuk mengembalikan kolom 1 & 4.

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4

Awk juga bisa melakukan ini:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4

Awk juga sedikit lebih mahir dalam berurusan dengan berbagai karakter pemisahan. Di sini ia berurusan dengan Tabsdi Spacesmana mereka saling dicampur pada saat yang sama:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

Bagaimana dengan -s untuk memotong?

Sehubungan dengan switch ini, itu hanya memberitahu cutuntuk tidak mencetak garis yang tidak mengandung karakter pembatas yang ditentukan melalui -dswitch.

Contoh

Katakanlah kita punya file ini.

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.

CATATAN: Ada spasi dan tab pada string ke-2 di atas.

Sekarang ketika kami memproses string ini menggunakan cutdengan dan tanpa -ssaklar:

$ cut -d" " -f1-6 sample.txt 
This is a space string.
This is a space  
Thisstringcontainsneither.

$ cut -d" " -f1-6 -s sample.txt 
This is a space string.
This is a space  

Dalam contoh 2 Anda dapat melihat bahwa -ssaklar telah menghilangkan string apa pun dari output yang tidak mengandung pembatas Space,.


8

Bidang menurut POSIX adalah bagian mana pun dari garis yang dibatasi oleh karakter di IFS, " pemisah bidang input (atau pemisah bidang internal ). " Nilai default dari ini adalah ruang, diikuti oleh tabulator horizontal, diikuti oleh baris baru . Dengan Bash Anda dapat berlari printf '%q\n' "$IFS"untuk melihat nilainya.


Lakukan echo '$IFS' | cat -vet untuk melihat bagaimana nilai default terlihat di shell.
C0deDaedalus

1
IFS digunakan oleh shell untuk sebagian besar tujuan (tidak semua), tetapi tidak oleh program lain dan secara khusus tidak oleh cutpertanyaan yang diajukan.
dave_thompson_085

Tidak seperti awk, cut juga mendukung hanya satu pembatas pada satu waktu, sehingga cut -d "$IFS"akan salah, sedangkan awk -F"[ \t\n]"berfungsi seperti yang diharapkan
JGurtz

2

Itu tergantung pada utilitas yang dimaksud, tetapi untuk cut, "bidang" dimulai pada awal baris teks, dan mencakup semuanya hingga tab pertama. Kolom kedua berjalan dari karakter setelah tab pertama, hingga tab berikutnya. Dan seterusnya untuk ketiga, keempat, ... Semua yang ada di antara tab, atau antara awal dan baris, atau antara tab dan akhir baris.

Kecuali jika Anda menentukan pembatas bidang dengan opsi "-d": Anda cut -d: -f2akan mendapatkan semuanya antara karakter titik dua pertama dan kedua (':').

Utilitas lain memiliki definisi yang berbeda, tetapi karakter tab adalah umum. awkadalah langkah mundur yang baik jika cutterlalu ketat, karena awkmembagi bidang berdasarkan satu atau lebih karakter spasi putih. Itu sedikit lebih alami dalam banyak situasi, tetapi Anda harus tahu sedikit sintaksis. Untuk mencetak kolom kedua menurut awk:

awk '{print $2}'

sortadalah orang yang menipu saya. sortHalaman manual saya saat ini mengatakan sesuatu seperti "transisi tidak kosong ke kosong" untuk pemisah bidang. Untuk beberapa alasan dibutuhkan beberapa upaya untuk mendapatkan sortbidang yang didefinisikan dengan benar. joinrupanya menggunakan bidang "dibatasi oleh spasi putih", yang merupakan awktujuan standar untuk dilakukan.

Moral dari cerita ini adalah berhati-hati, dan bereksperimen jika Anda tidak tahu.


2

Istilah "bidang" tidak terkait dengan linux secara umum, tetapi dengan program tertentu. Jadi cutgunakan jenis bidang yang berbeda dari sort.

Dengan cut, Anda menentukan sendiri apa itu bidang, dengan menentukan pembatas bidang dengan opsi -d, yang memisahkan bidang di setiap baris.

Jika data Anda dipisahkan oleh titik dua di baris, Anda dapat menggabungkan -ddan -fmendapatkan bidang (atau kolom) 2, 3 dan 6 seperti ini:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6

1

Ketika Anda menggunakan cutperintah maka dibutuhkan dua argumen utama

-d: yang merupakan pembatas

-f: yang merupakan bidang yang akan dipotong dari file input

Ex. cut - d "|"  - f1, 2 input_filename

Di sini outputakan dipisahkan oleh pembatas "|" dan itu akan memotong hanya 2 bidang dari file input

Jika Anda memiliki baris berikut dalam file Anda

Alex|120000|Admin|1999

Maka akan memotong 2 bidang yang

Alex|120000

Contoh Anda benar-benar rusak karena ruang yang salah, dan bahkan jika benar ini tidak menambahkan apa pun ke jawaban yang diberikan 4 tahun lalu.
dave_thompson_085

0

cutsangat bagus untuk kasus-kasus sederhana, di mana pembatas adalah karakter tunggal dan Anda ingin menampilkan subset dari bidang input, dalam urutan yang sama (bahkan jika saya tentukan -f3,2,1, itu bertindak sama seperti -f1,2,3).

awkone-liner jauh lebih fleksibel, misalnya ketika pemisah bidang input mungkin berupa spasi putih ( awkdefault), atau ketika Anda ingin menampilkan bidang dalam urutan yang berbeda atau dengan format tertentu.

Misalnya wc -l myfile | awk '{print $1}'atau ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'sangat sederhana, tetapi akan sulit dilakukan cut.

Saya setuju dengan poster sebelumnya bahwa bidang / kunci sortsulit diketahui ! Fields in jointampaknya berfungsi sama dengan in cut, meskipun joinopsi mudah salah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.