Jawaban:
Istilah "bidang" sering kali dikaitkan dengan alat seperti cut
dan 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 -F"," ...
- akan dipisahkan oleh koma (yaitu ,).cut -d"," ...
- akan dipisahkan dengan koma (yaitu ,).Yang pertama ini menunjukkan bagaimana awk
secara otomatis akan membagi ruang.
$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.
Ini menunjukkan bagaimana cut
akan 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 cut
untuk 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.
Sehubungan dengan switch ini, itu hanya memberitahu cut
untuk tidak mencetak garis yang tidak mengandung karakter pembatas yang ditentukan melalui -d
switch.
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 cut
dengan dan tanpa -s
saklar:
$ 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 -s
saklar telah menghilangkan string apa pun dari output yang tidak mengandung pembatas Space,.
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.
cut
pertanyaan yang diajukan.
cut -d "$IFS"
akan salah, sedangkan awk -F"[ \t\n]"
berfungsi seperti yang diharapkan
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: -f2
akan mendapatkan semuanya antara karakter titik dua pertama dan kedua (':').
Utilitas lain memiliki definisi yang berbeda, tetapi karakter tab adalah umum. awk
adalah langkah mundur yang baik jika cut
terlalu ketat, karena awk
membagi 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}'
sort
adalah orang yang menipu saya. sort
Halaman manual saya saat ini mengatakan sesuatu seperti "transisi tidak kosong ke kosong" untuk pemisah bidang. Untuk beberapa alasan dibutuhkan beberapa upaya untuk mendapatkan sort
bidang yang didefinisikan dengan benar. join
rupanya menggunakan bidang "dibatasi oleh spasi putih", yang merupakan awk
tujuan standar untuk dilakukan.
Moral dari cerita ini adalah berhati-hati, dan bereksperimen jika Anda tidak tahu.
Istilah "bidang" tidak terkait dengan linux secara umum, tetapi dengan program tertentu. Jadi cut
gunakan 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 -d
dan -f
mendapatkan bidang (atau kolom) 2, 3 dan 6 seperti ini:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
Ketika Anda menggunakan cut
perintah 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 output
akan 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
cut
sangat 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
).
awk
one-liner jauh lebih fleksibel, misalnya ketika pemisah bidang input mungkin berupa spasi putih ( awk
default), 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 sort
sulit diketahui ! Fields in join
tampaknya berfungsi sama dengan in cut
, meskipun join
opsi mudah salah.
echo '$IFS' | cat -vet
untuk melihat bagaimana nilai default terlihat dishell
.