seq
Satır başına bir tamsayı dizisi oluşturma komutunu biliyorum , ama iki soru sormak istiyorum:
Dizinin numaralarını aynı satıra yazmak mümkün müdür?
Boşluk ile ayrılmış sayı dizisinden oluşan bir dize oluşturmak mümkün müdür?
seq
Satır başına bir tamsayı dizisi oluşturma komutunu biliyorum , ama iki soru sormak istiyorum:
Dizinin numaralarını aynı satıra yazmak mümkün müdür?
Boşluk ile ayrılmış sayı dizisinden oluşan bir dize oluşturmak mümkün müdür?
Yanıtlar:
İle bash
, zsh
ve ksh93
kullanabileceğiniz {start..end..step} ayracı genişleme formu :
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Tüm kabuklara ve seq'e sahip herhangi bir sisteme taşınabilir (bu sorular etiketlendiğinden)
Başlangıç 1 ise:
$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10
Aksi takdirde:
$ echo $(seq 5 10)
5 6 7 8 9 10
Bc ile:
$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)
Bash
echo {1..10}
Bu yankı çözümü, IFS değeri varsayılan olarak yaptığı bir yeni satır içeriyorsa çalışır.
Varsayılan olarak, IFS <boşluk ><tab> <newline> sekansına ayarlıdır . Ve kabuğun her temiz başlangıcı için sıfırlanır. Ancak, bazı aşırı köşe durumlarında değişmiş olabileceğine dair endişeleriniz varsa, birkaç çözümümüz var.
Bash, zsh, ksh altında şunu kullanın: IFS = $ '\ t \ n' (bu cevabın geri kalanını atlayın).
Bununla birlikte, IFS değerinin sh altında sıfırlanması karmaşık olabilir Tüm ayrıntıları buradan okuyun .
$ unset IFS; echo $(seq 5 10) #Always work.
her zaman çalışır. Aşağıda, IFS'nin ayarlanması gereken bir komut dosyası gibi IFS gerektiren bir kod (veya alt komut dosyaları) olmaması şartıyla OldIFS="$IFS"
.
Sh için bir hile kullanma :
sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd' # correct.
IFS='<space><tab><newline>'
alanlardır <space>
, <tab>
, <newline>
karşılık gelen edebi karakterlerdir.
seq 10 |xargs
...veya...
seq 10 |paste -s -
Yukarıdaki komutların her ikisi de tam sayıları boşlukla ayıracaktır. xargs
varsayılan olarak taklit eder /bin/echo
ve böylece her tamsayı tek bir boşlukla ayrılır. Bununla birlikte, varsayılan olarak en fazla 128K komut satırı uzunluğuna sahip olacaktır. Bunu ayarlayabilirsiniz ...
seq 100000 | xargs -s2093009 | wc -l
... baskılar 1. Ben -s
burada değer keyfi değil - (görünüşte zaten çalıştı) daha yüksek bir değer denedikten sonra aldım ama daha sonra xargs
yararlı mesajı yazdırdı:
-s value should be <2093010
paste
iki biridir (bilgi) istenilen uzunlukta hatları işlemek için araçlar POSIX onaylanmış:
paste
şartname uygulama kullanımı :Standart yardımcı programların çoğu metin dosyaları üzerinde çalışır . Yardımcı
cut
program, rasgele satır uzunluklarına sahip dosyaları aynı verileri içeren bir metin dosyaları kümesine dönüştürmek için kullanılabilir. Yardımcıpaste
program, rasgele satır uzunluklarına sahip dosyalar oluşturmak (veya yeniden oluşturmak) için kullanılabilir.Sıfır veya daha fazla satır halinde düzenlenmiş karakterler içeren bir dosya. Satırlar NUL karakterleri içermez ve hiçbiri ewline karakteri
{LINE_MAX}
de dahil olmak üzere bayt uzunluğunu aşamaz\n
. POSIX.1-2008 metin dosyaları ve ikili dosyalar arasında ayrım yapmasa da (ISO C standardına bakın) , birçok yardımcı program metin dosyaları üzerinde çalışırken yalnızca öngörülebilir veya anlamlı çıktı üretir. Böyle bir kısıtlamaya gerek standart gereçleri her zaman belirtmek metin dosyaları kendi içinde STDIN veya GİRİŞ DOSYALARI bölümleri.
paste
varsayılan olarak bir sekme sınırlayıcıdır ve böylece ikinci komutu izleyen her tamsayı arasında bir sekme olacaktır. Yapabilirsin...
seq 10 |paste -sd ' ' -
... -d
bu davranışı değiştirmek için elimiter anahtarını kullanın,
seq 10 | xargs
iyi çalışıyor, ancak komut satırı sınırları nedeniyle, seq 100000 | xargs
5 \n
sınırlandırılmış satır çıktı (sistemimde)
paste and
cut`, keyfi uzunluk çizgileriyle çalışmak için POSIX onaylı iki yardımcı programdır . Bununla birlikte xargs | xargs
, bir seçenek. Or elseseq 100000|tr \\n \
$IFS
bir sayı ayarlamayı denemiyorsunuz ? Ve bash
yine de onun yavaş yavaş yavaşça. Cevabınızdan bahsediyorsunuz sh
- $IFS
bu bağlamda ayarlamanız bile gerekmiyor - eğer orada ayarlanmışsa, ortamdan geçecektir. Ve seq 100000|paste -s
performans açısından 5: 1'i geçenden daha kısa değil . Ve paste
hiçbir gotchas ile gelmiyor.
$IFS
- her zaman kullanıyorum - ama ben ayarlamadığım sürece kullanmıyorum ve siz de yapmamalısınız. Özellikle bunu yapması gereken daha iyi bir şey bilmeyen rastgele yabancılara tavsiye etmemelisiniz. Bunu şansa bırakmayın - bu bir bilgisayar programı. Beklenmedik bir şekilde davranması bir hatadır - neden izin verilebilir?
echo $(seq 1 10)