Saya perlu mengulang beberapa nilai,
for i in $(seq $first $last)
do
does something here
done
Untuk $first
dan $last
, saya perlu panjangnya tetap 5. Jadi jika inputnya 1
, saya perlu menambahkan nol di depan sehingga menjadi 00001
. 99999
Misalnya loop , tetapi panjangnya harus 5.
Misalnya: 00002
, 00042
, 00212
, 012312
dan sebagainya.
Ada ide tentang bagaimana saya bisa melakukan itu?
for variable in $(something to generate the numbers); do ...
tetapi ini bermasalah ketika daftar angka panjang. Ini jauh lebih efisien untuk digunakansomething to generate the numbers | while read -r variable; do ...
. Lihat juga mywiki.wooledge.org/DontReadLinesWithFor yang membahas membaca baris dari file dll, tetapi beberapa argumen juga berlaku di sini.Jawaban:
Dalam kasus spesifik Anda, mungkin paling mudah menggunakan
-f
benderaseq
untuk memformat angka saat mengeluarkan daftar. Sebagai contoh:akan menghasilkan output berikut:
Secara umum,
bash
memilikiprintf
built-in sehingga Anda dapat menambahkan output dengan nol sebagai berikut:Anda bisa menggunakan
-v
flag untuk menyimpan output di variabel lain:Perhatikan bahwa
printf
mendukung format yang sedikit berbeda untukseq
sehingga Anda perlu menggunakan%05d
bukan%05g
.sumber
%05g
bukannya%05d
memperbaikinya untuk saya. "00026" memberi saya "00022" . Terima kasih!seq
mendukung subset dari format chars. yangprintf
mendukung (dan himpunan bagian itu termasukg
, tetapi tidakd
). Perilaku karakterd
dang
berbeda halus dalamd
menafsirkan0
-prefixed nomor string sebagai oktal angka dan bertobat mereka untuk desimal, sedangkang
memperlakukan mereka sebagai desimal. (@EdManet: itu sebabnya '00026' berubah menjadi '00022' dengand
). Hal lain yang layak disebut:seq -w
melakukan pengisian-nol otomatis dari nomor-nomor keluaran berdasarkan pada angka terlebar yang dihasilkan.for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txt
menghasilkan daftar heksadesimal 8 karakter. Terima kasih.seq --help
: "FORMAT harus sesuai untuk mencetak satu argumen dengan tipe 'ganda'; standarnya adalah%. PRECf jika PERTAMA, PENINGKATAN, dan TERAKHIR adalah semua angka desimal titik tetap dengan presisi PREC maksimum, dan untuk% g sebaliknya." Kemungkinan penentu konversi adalahefgaEFGA
.Lebih mudah masih bisa Anda lakukan
sumber
4.4.23(1)-release
Jika akhir urutan memiliki panjang maksimal padding (misalnya, jika Anda ingin 5 digit dan perintahnya adalah "seq 1 10000"), maka Anda dapat menggunakan flag "-w" untuk seq - menambahkan padding itu sendiri.
menghasilkan
sumber
gunakan printf dengan misalnya "% 05d"
sumber
Penggunaannya sangat sederhana
printf
sumber
Gunakan awk seperti ini:
KELUARAN:
Memperbarui:
Sebagai alternatif bash murni Anda dapat melakukan ini untuk mendapatkan hasil yang sama:
Dengan cara ini Anda dapat menghindari menggunakan program eksternal
seq
yang TIDAK tersedia pada semua rasa * nix.sumber
awk's
BEGIN
pernyataan sehingga kita tidak harus menggunakanheredoc
tugas.I pad output dengan lebih banyak digit (nol) daripada yang saya butuhkan kemudian gunakan tail untuk hanya menggunakan jumlah digit yang saya cari. Perhatikan bahwa Anda harus menggunakan '6' untuk mendapatkan lima digit terakhir :)
sumber
Jika Anda ingin N digit, tambahkan 10 ^ N dan hapus digit pertama.
Keluaran:
sumber
Ini akan bekerja juga:
sumber
Cara lain :
Jadi fungsi sederhana untuk mengonversi angka apa pun adalah:
sumber
Salah satu cara tanpa menggunakan forking proses eksternal adalah manipulasi string, dalam kasus umum akan terlihat seperti ini:
Ini berfungsi dengan baik di WSL juga, di mana forking adalah operasi yang sangat berat. Saya memiliki daftar 110000 file, menggunakan
printf "%06d" $NUM
waktu lebih dari 1 menit, solusi di atas berjalan dalam waktu sekitar 1 detik.sumber
1.) Buat urutan angka 'seq' dari 1 hingga 1000, dan perbaiki lebar '-w' (lebar ditentukan oleh panjang angka akhir, dalam hal ini 4 digit untuk 1000).
2.) Juga, pilih angka yang ingin Anda gunakan 'sed -n' (dalam hal ini, kami memilih angka 1-100).
3.) 'gema' setiap nomor. Angka disimpan dalam variabel 'i', diakses menggunakan '$'.
Pro: Kode ini cukup bersih.
Cons: 'seq' bukan asli dari semua sistem Linux (seperti yang saya mengerti)
sumber
Jika Anda hanya setelah nomor padding dengan nol untuk mencapai panjang tetap, cukup tambahkan kelipatan terdekat dari 10 misalnya. untuk 2 digit, tambahkan 10 ^ 2, lalu hapus 1 pertama sebelum menampilkan output.
Solusi ini berfungsi untuk mem-pad / memformat angka tunggal dengan panjang berapa pun, atau seluruh urutan angka menggunakan for for.
Diuji pada Mac OSX 10.6.8, Bash ver 3.2.48
sumber