Pertanyaan bodoh di sini: bagian / 1 adalah untuk mengatakan awk hanya memproses baris (atau catatan lebih tepatnya) yang berisi angka 1 kan?
rantsh
3
Sintaks @rantsh Awk sepertinya (pattern){action}. Jika pattern(kebanyakan pernyataan bersyarat) benar , actiondieksekusi. Jika patterntidak tersedia, truetersirat. Di sini patternadalah /1/negara yang 1dicocokkan regex dalam catatan saat ini$0
kvantour
62
Jika Anda ingin melakukannya secara terprogram, Anda dapat menggunakan FSvariabel:
Perhatikan bahwa jika Anda mengubahnya di loop utama daripada BEGIN loop, itu akan mempengaruhi baris berikutnya yang dibaca, karena baris saat ini telah terpecah.
mana cara yang disukai? saya berasumsi contoh terakhir dengan BEGINpernyataan akan menjadi yang paling benar (konsisten dengan awksintaksis keseluruhan ).
1
@randomware semuanya baik-baik saja. Saya cenderung menggunakan BEGINjika saya menggunakan file untuk menyimpan semuanya, sementara -Fberguna dengan satu-liner.
fedorqui 'SO berhenti merugikan'
1
Harus dikatakan bahwa ada perbedaan halus antara kasus ketiga dan yang lainnya. Contoh: awk 'BEGIN{print split("foo:bar",a)}' FS=":" filedanawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Anda juga dapat menggunakan regex sebagai pemisah bidang, yang berikut ini akan mencetak "bar" dengan menggunakan regex untuk menetapkan angka "10" sebagai pemisah.
Tidak Perlu banyak menulis ini. Masukkan saja pemisah bidang yang Anda inginkan dengan opsi -F di perintah awk dan nomor kolom yang ingin Anda cetak dipisahkan sesuai pemisah bidang yang Anda sebutkan.
AWK berfungsi sebagai penerjemah teks yang berlaku secara linier untuk seluruh dokumen dan berlaku secara fieldwise untuk setiap baris sehingga $ 1, $ 2 .. $ n adalah referensi ke bidang masing-masing baris ($ 1 adalah bidang pertama, $ 2 adalah bidang kedua dan seterusnya ...). Anda dapat mendefinisikan pemisah bidang dengan menggunakan sakelar "-F" di bawah baris perintah atau dalam dua tanda kurung dengan "FS = ...". Sekarang pertimbangkan jawaban "JUERGEN":
echo "1: "| awk -F ":"'/1/ {print $1}'
Di atas batas bidang ditetapkan oleh ":" jadi kami memiliki dua bidang $ 1 yang merupakan "1" dan $ 2 yang merupakan ruang kosong. ketika penerjemah tersandung pada garis yang mengandung ungkapan seperti itu (maksud saya 1); Output dari perintah "echo" adalah satu baris yang berisi "1" sehingga filter akan berfungsi ...
Ketika berhadapan dengan contoh berikut:
echo "1: "| awk '/1/ -F ":" {print $1}'
Sintaksnya berantakan dan interpreter memilih untuk mengabaikan bagian F ":"
dan beralih ke bidang splitter standar yang merupakan ruang kosong sehingga menghasilkan "1:" sebagai bidang pertama dan tidak akan ada bidang kedua!
(pattern){action}
. Jikapattern
(kebanyakan pernyataan bersyarat) benar ,action
dieksekusi. Jikapattern
tidak tersedia,true
tersirat. Di sinipattern
adalah/1/
negara yang1
dicocokkan regex dalam catatan saat ini$0
Jika Anda ingin melakukannya secara terprogram, Anda dapat menggunakan
FS
variabel:Perhatikan bahwa jika Anda mengubahnya di loop utama daripada
BEGIN
loop, itu akan mempengaruhi baris berikutnya yang dibaca, karena baris saat ini telah terpecah.sumber
Anda memiliki banyak cara untuk ditetapkan
:
sebagai pemisah:Semuanya setara dan untuk akan kembali
1
untuk input sampel "1: 2: 3":sumber
BEGIN
pernyataan akan menjadi yang paling benar (konsisten denganawk
sintaksis keseluruhan ).BEGIN
jika saya menggunakan file untuk menyimpan semuanya, sementara-F
berguna dengan satu-liner.awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
danawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
-F
adalah argumen untukawk
dirinya sendiri:sumber
Anda juga dapat menggunakan regex sebagai pemisah bidang, yang berikut ini akan mencetak "bar" dengan menggunakan regex untuk menetapkan angka "10" sebagai pemisah.
sumber
Tidak Perlu banyak menulis ini. Masukkan saja pemisah bidang yang Anda inginkan dengan opsi -F di perintah awk dan nomor kolom yang ingin Anda cetak dipisahkan sesuai pemisah bidang yang Anda sebutkan.
sumber
AWK berfungsi sebagai penerjemah teks yang berlaku secara linier untuk seluruh dokumen dan berlaku secara fieldwise untuk setiap baris sehingga $ 1, $ 2 .. $ n adalah referensi ke bidang masing-masing baris ($ 1 adalah bidang pertama, $ 2 adalah bidang kedua dan seterusnya ...). Anda dapat mendefinisikan pemisah bidang dengan menggunakan sakelar "-F" di bawah baris perintah atau dalam dua tanda kurung dengan "FS = ...". Sekarang pertimbangkan jawaban "JUERGEN":
Di atas batas bidang ditetapkan oleh ":" jadi kami memiliki dua bidang $ 1 yang merupakan "1" dan $ 2 yang merupakan ruang kosong. ketika penerjemah tersandung pada garis yang mengandung ungkapan seperti itu (maksud saya 1); Output dari perintah "echo" adalah satu baris yang berisi "1" sehingga filter akan berfungsi ...
Ketika berhadapan dengan contoh berikut:
Sintaksnya berantakan dan interpreter memilih untuk mengabaikan bagian F ":" dan beralih ke bidang splitter standar yang merupakan ruang kosong sehingga menghasilkan "1:" sebagai bidang pertama dan tidak akan ada bidang kedua!
Jawaban JUERGEN berisi sintaks yang baik ...
sumber
Atau Anda dapat menggunakan:
Ini persamaan yang sangat lucu.
sumber
/1/
artinya