Cara membagi string ketika mengandung simbol pipa |
di dalamnya. Saya ingin membaginya menjadi array.
Saya mencoba
echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'
Itu bekerja dengan baik. Jika string saya seperti "12|23|11"
lalu bagaimana cara membaginya menjadi array?
OFS
, koma tetap di antara mereka, menjadikannyaprint
sebagai argumen yang terpisah.echo "12:23:11" | sed "s/.*://"
echo "12:23:11" | sed "s/.*://"
) hapus semuanya sampai (dan termasuk) ":" terakhir, simpan hanya "11" ... itu berfungsi untuk mendapatkan nomor terakhir, tetapi perlu diubah (dengan cara yang sulit dibaca) untuk mendapatkan nomor 2, dll. awk (dan split awk) jauh lebih elegan dan mudah dibaca.cut
Jawaban:
Sudahkah Anda mencoba:
sumber
split
adalah ekspresi reguler, dan|
merupakan simbol khusus, yang harus diloloskan. Gunakansplit($0, a, "\|")
|
dilihat sebagai char dan bukan simbol khusus adalah dengan meletakkannya di antara[]
: yaitu,split($0, a, "[|]")
# Saya suka ini lebih baik daripada '\ |', dalam beberapa kasus, terutama karena beberapa varian regexp ( perl vs grep vs .. lainnya?) dapat memiliki "|" diinterpretasikan secara harfiah dan "\ |" dilihat sebagai pemisah regex, bukannya sebaliknya ... ymmvUntuk membagi string ke array di
awk
kita menggunakan fungsisplit()
:Jika tidak ada pemisah yang diberikan, ia menggunakan
FS
, yang default ke spasi:Kami dapat memberikan pemisah, misalnya
:
:Yang setara dengan mengaturnya melalui
FS
:Di gawk Anda juga dapat menyediakan pemisah sebagai regexp:
Dan bahkan melihat apa pembatas pada setiap langkah dengan menggunakan parameter keempatnya:
Mari kutip halaman manual GNU awk :
sumber
Harap lebih spesifik! Apa yang Anda maksud dengan "itu tidak berhasil"? Posting output yang tepat (atau pesan kesalahan), OS Anda dan versi awk:
Atau, menggunakan split:
Sunting: pada Solaris Anda harus menggunakan POSIX awk ( / usr / xpg4 / bin / awk ) untuk memproses 4000 bidang dengan benar.
sumber
for(i = 0
ataufor(i = 1
?for (i = 1; i <= n; ++i)
...Saya tidak suka
echo "..." | awk ...
solusinya karena panggilan tidak perlufork
danexec
panggilan sistem.Saya lebih suka solusi Dimitre dengan sedikit twist
Atau versi yang sedikit lebih pendek:
Dalam hal ini catatan keluaran disatukan yang merupakan kondisi sebenarnya, sehingga dicetak.
Dalam kasus khusus ini
stdin
pengalihan dapat disimpan dengan pengaturanawk variabel internal:Saya menggunakan ksh cukup lama, tetapi di pestaini dapat dikelola dengan manipulasi string internal. Dalam kasus pertama string asli dibagi oleh terminator internal. Dalam kasus kedua diasumsikan bahwa string selalu berisi pasangan digit yang dipisahkan oleh pemisah satu karakter.
Hasilnya dalam semua kasus adalah
sumber
bash
ungkapan ini ...Sebenarnya
awk
memiliki fitur yang disebut tautan 'Input Field Separator Variable' . Inilah cara menggunakannya. Ini sebenarnya bukan array, tetapi menggunakan variabel $ internal. Untuk memisahkan string sederhana lebih mudah.sumber
harus bekerja.
sumber
sumber
Lelucon? :)
Bagaimana tentang
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'
Ini adalah output saya:
jadi saya kira itu berhasil setelah semua ..
sumber
Saya tahu ini adalah pertanyaan lama, tapi saya pikir mungkin seseorang menyukai tipuan saya. Terutama karena solusi ini tidak terbatas pada jumlah item tertentu.
Outputnya adalah:
sumber