Bagaimana cara mendefinisikan pembatas 'tab' dengan 'cut' dalam BASH?

215

Berikut adalah contoh penggunaan cutuntuk memecah input ke dalam bidang menggunakan pembatas ruang, dan mendapatkan bidang kedua:

cut -f2 -d' '

Bagaimana pembatas dapat didefinisikan sebagai tab, bukan spasi?

Muhammad Hasan Khan
sumber
4
Tab adalah pembatas default. cut -f 2
Melah

Jawaban:

301

Dua arah:

Tekan Ctrl+ Vlalu Tab.

cut -f2 -d'   ' infile

atau tulis seperti ini:

cut -f2 -d$'\t' infile
Birei
sumber
10
$ '' - bash'ism, AFAIR
poige
8
Tidak ada yang bekerja di Windows (misalnya, Git Bash) jelas. Gunakan jawaban @ Mikel di sana (pembatas default adalah tab, cukup hilangkan -dargumen).
Ahmed Fasih
4
@poige, itu berasal dari ksh93, bukan bash. Itu didukung oleh ksh93, zsh, bash, mksh, dan FreeBSD sh setidaknya ( itu mungkin membuatnya ke pembalikan utama berikutnya dari spesifikasi standar POSIX untuksh ).
Stéphane Chazelas
3
@micurb Itulah kutipan ANSI-C: gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
wisbucky
191

Tab adalah default.

Lihat halaman cut man .

-d delim
         Use delim as the field delimiter character instead of the tab
         character.

Jadi, Anda harus menulis

cut -f 2
Mikel
sumber
2
Ups tidak memperhatikan garis itu.
Muhammad Hasan Khan
4
Tetapi mungkin selalu lebih aman untuk menyebutkan flag semacam itu secara eksplisit, baik untuk keterbacaan maupun portabilitas. Saya bisa membayangkan beberapa orang mendesain cutuntuk Windows tidak akan mengikuti standar lengkap.
Willem Van Onsem
3
Ini harus diterima jawaban: kode paling sederhana, penjelasan paling sederhana. ya dipaku: youtube.com/watch?v=dpNTHl7y45Y
neuronet
5
Jawaban ini telah mengubah hidup saya
matheeeny
1
@ WillemVanOnsem, jika seseorang menulis versi cutuntuk Windows dan tidak mengikuti spesifikasi POSIX untuknya, tidak ada alasan untuk menganggap bahwa skrip POSIX apa pun akan bekerja dengan sistem itu. Tetap berpegang pada fitur yang ditentukan POSIX. Jangan coba-coba mengizinkan implementasi hipotetis di masa depan yang hipotetis; bukan itu yang dimaksud dengan "portabilitas".
Wildcard
12
awk -F '\t' '{ print $2 }' inputfile

Ini mengekstrak bidang tab-delimited kedua dari setiap baris input dari inputfile.

Iľja
sumber
10

Lebih umum, tanpa memerlukan karakter yang tidak terlihat: Gunakan truntuk mengkonversi pembatas ke format yang dapat ditentukan dengan lebih mudah cut.

$ echo -e "a\tb\tc" |tr '\t' ' ' |cut -d' ' -f2
b

tr adalah alat pencocokan dan penggantian karakter yang sederhana namun kuat.

bangsawan
sumber
1
Tetapi bagaimana jika inputnya abc(space)def(tab)ghi? Jawaban Anda akan menghasilkan def, tetapi harus menghasilkan ghi. Demikian pula, jika inputnya adalah ABC(tab)DEF(space)GHI, jawaban Anda akan menghasilkan DEF, tetapi harus menghasilkan DEF(space)GHI.
G-Man
@ G-Man: Pembatas ruang hanyalah contoh. Gunakan pembatas apa pun yang sesuai untuk data Anda - misalnya koma. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
nobar
... Tapi, ya, jika pembatas harus berupa tab, maka pendekatan saya tidak akan berhasil.
nobar