Saya menemukan bahwa jika kita menggunakan awk 0 inputfile
, itu tidak akan mencetak apa pun karena 0
berarti kondisi yang salah.
Jika kita gunakan awk 1 inputfile
, itu akan mencetak segala sesuatu sebagai 1
benar untuk setiap baris penafsiran awk.
Jika kita menggunakan awk any_string inputfile
, itu tidak akan mencetak apa-apa karena semua variabel awk diinisialisasi sebagai nol sehingga salah.
Tetapi jika kita gunakan awk any_integer inputfile
, itu akan menjadi benar dan mencetak setiap baris file, bolehkah saya tahu apa alasannya?
Saya tidak dapat menemukan ini telah dijelaskan dalam manual GNUawk
.
any_integer
Saya kira Anda berarti jumlah literal seperti7, 89
dll .. jika demikian, alasannya adalah setiap angka selain0
saranatrue
kondisiJawaban:
True for awk adalah string yang tidak kosong atau angka yang tidak nol (dengan angka menjadi bilangan bulat desimal atau floating point dan dengan beberapa implementasi awk yang didukung juga heksadesimal atau oktal). Hal-hal yang dilampirkan dalam tanda kutip ganda adalah string, angka literal yang tidak dikutip adalah angka, tetapi untuk hal lain, ada aturan kompleks untuk menentukan apakah sesuatu harus diperlakukan sebagai string atau angka.
awk
Manual GNU memiliki seluruh bab tentang itu .Benar:
awk '1'
(angka bukan nol)awk '1e8'
(angka bukan nol)awk '-0.01'
(angka bukan nol)awk '"foo"'
(string tidak kosong)awk '"0"'
(string tidak kosong)awk '0 ""'
(Rangkaian menghasilkan string yang di sini tidak kosong)echo 0 | awk '$1 ""'
(sama untuk bidang $ n)awk 'substr("000", 1, 1)'
(hasilsubstr()
selalu berupa string)echo '0foo' | awk '$0'
($ 0 adalah string non-numerik sehingga dianggap sebagai string (non-kosong))Salah:
awk '0'
(0 angka)awk '""'
(string kosong)echo 0000e123 | awk '$1'
($ 1 dianggap angka jika itu adalah string numerik yang ada di sini dan menjadi 0)echo ' 0 ' | awk '$0'
(spasi awal dan akhir diabaikan untuk menentukan apakah string numerik).awk '" 2foo" - 2'
(string yang terlibat dalam ekspresi aritmatika dikonversi ke angka dengan apapun yang melewati angka tersebut diabaikan)awk 'unset_or_empty_variable'
(string kosong)awk '"non-numerical-string" + 0'
YMMV:
awk '1e-500'
(beberapa akan mengeluh, beberapa akan memperlakukannya sebagai 0)awk '"0x1" + 0'
(tidak semua implementasi awk mendukung heksadesimal, pada yang"0x1"
dikonversikan ke1
, pada yang lain ke0
. Beberapa versi spesifikasi POSIX secara tidak sengaja memerlukan implementasi untuk mendukung nomor heksadesimal di sana dan telah ditarik kembali nanti. Masihgawk
mengenali nomor hex ketikaPOSIXLY_CORRECT
ada di lingkungan)awk '010 - 8'
(sama (juga tidak cukup seperti 010 adalah literal di sini sebagai lawan dikonversi dari string) untuk oktal)awk '0x1 - 1'
(padaawk
implementasi yang tidak mendukung angka hex,0x1
adalah gabungan dari0
danx1
variabel yang menghasilkan"0"
yang dikonversi ke angka (0), jika Anda mengurangi1
Anda mendapatkan-1
yang bukan angka nol).Apa artinya itu adalah bahwa jika Anda ingin memeriksa apakah string tidak kosong, Anda tidak boleh melakukannya:
Tapi
Kalau tidak, itu tidak akan mengatakan
0
atau-0000E+00001234
tidak kosong.sumber