Muszę zapętlić niektóre wartości,
for i in $(seq $first $last)
do
does something here
done
Dla $first
i $last
, muszę go mieć ustaloną długość 5. Więc jeśli wejście jest 1
, muszę dodać zer w przód tak, że staje się 00001
. Zapętla się, 99999
na przykład, ale długość musi wynosić 5.
Np: 00002
, 00042
, 00212
, 012312
i tak dalej.
Masz pomysł, jak to zrobić?
for variable in $(something to generate the numbers); do ...
ale jest to problematyczne, gdy lista liczb jest długa. Jest o wiele bardziej wydajny w użyciusomething to generate the numbers | while read -r variable; do ...
. Zobacz także mywiki.wooledge.org/DontReadLinesWithFor, w którym omawia się czytanie wierszy z plików itp., Ale niektóre argumenty również tutaj mają zastosowanie.Odpowiedzi:
Jednak w twoim konkretnym przypadku prawdopodobnie najłatwiej jest użyć
-f
flagiseq
, aby sformatować liczby podczas wyświetlania listy. Na przykład:wytworzy następujące dane wyjściowe:
Mówiąc bardziej ogólnie,
bash
maprintf
wbudowaną funkcję, dzięki czemu można uzupełniać dane wyjściowe zerami w następujący sposób:Możesz użyć
-v
flagi do przechowywania danych wyjściowych w innej zmiennej:Zauważ, że
printf
obsługuje nieco inny format,seq
więc musisz użyć%05d
zamiast%05g
.źródło
%05g
zamiast%05d
tego dla mnie naprawić. „00026” dawało mi „00022” . Dzięki!seq
obsługuje podzbiór znaków formatu. któryprintf
obsługuje (i który obejmuje podzbioryg
, ale nie obejmujed
). Zachowanie znakówd
ig
różni się subtelnie tym, żed
interpretuje0
ciągi liczb z prefiksem jako liczby ósemkowe i konwertuje je na dziesiętne, podczas gdyg
traktuje je jako dziesiętne. (@EdManet: dlatego „00026” zamieniło się w „00022” zd
). Kolejna rzecz, o której warto wspomnieć:seq -w
czy automatyczne uzupełnianie zerami liczb wyjściowych na podstawie największej liczby wygenerowanych.for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txt
utworzył 8-znakową listę szesnastkową. Dzięki.seq --help
: „FORMAT musi nadawać się do drukowania jednego argumentu typu„ double ”; domyślnie jest to% .PRECf, jeśli FIRST, INCREMENT i LAST są liczbami stałymi dziesiętnymi z maksymalną dokładnością PREC, a w przeciwnym razie% g.” Możliwe specyfikatory konwersji toefgaEFGA
.Łatwiej jeszcze możesz to zrobić
źródło
4.4.23(1)-release
Jeśli koniec sekwencji ma maksymalną długość dopełnienia (na przykład, jeśli chcesz 5 cyfr, a polecenie to „seq 1 10000”), możesz użyć flagi „-w” dla seq - dodaje to dopełnienie.
produkować
źródło
użyj printf z „% 05d” np
źródło
Bardzo proste w użyciu
printf
źródło
Użyj awk w następujący sposób:
WYNIK:
Aktualizacja:
Jako czystą alternatywę bash możesz to zrobić, aby uzyskać ten sam wynik:
W ten sposób można uniknąć używania zewnętrznego programu,
seq
który NIE jest dostępny we wszystkich wersjach * nix.źródło
awk's
BEGIN
oświadczenia, abyśmy nie musieli korzystać zheredoc
zadania.Wypełniam dane wyjściowe większą liczbą cyfr (zer) niż potrzebuję, a następnie używam tail, aby użyć tylko liczby cyfr, których szukam. Zauważ, że musisz użyć „6” w ogonie, aby uzyskać ostatnie pięć cyfr :)
źródło
Jeśli chcesz N cyfr, dodaj 10 ^ N i usuń pierwszą cyfrę.
Wynik:
źródło
Działa to również:
źródło
Inny sposób :
Tak prostą funkcją konwersji dowolnej liczby byłoby:
źródło
Jednym ze sposobów bez użycia zewnętrznego rozwidlania procesów jest manipulacja ciągami, w ogólnym przypadku wyglądałoby to tak:
Działa to również całkiem dobrze na WSL, gdzie rozwidlenie jest naprawdę ciężką operacją. Miałem listę 110000 plików, użycie
printf "%06d" $NUM
zajęło mi ponad 1 minutę, powyższe rozwiązanie działało za około 1 sekundę.źródło
1.) Utwórz ciąg liczb „seq” od 1 do 1000 i ustal szerokość „-w” (szerokość jest określana na podstawie długości numeru końcowego, w tym przypadku 4 cyfry na 1000).
2.) Wybierz także liczby, które chcesz, używając „sed -n” (w tym przypadku wybieramy liczby 1-100).
3.) „echo” każdego numeru. Liczby są przechowywane w zmiennej „i”, dostępnej za pomocą „$”.
Plusy: Ten kod jest całkiem czysty.
Wady: „seq” nie jest natywny dla wszystkich systemów Linux (jak rozumiem)
źródło
Jeśli chcesz dopełnić liczby zerami, aby uzyskać stałą długość, po prostu dodaj najbliższą wielokrotność 10, np. dla 2 cyfr dodaj 10 ^ 2, a następnie usuń pierwszą 1 przed wyświetleniem wyniku.
To rozwiązanie działa na pad / format pojedynczych liczb o dowolnej długości lub całej sekwencji liczb za pomocą pętli for.
Testowane na Mac OSX 10.6.8, Bash wersja 3.2.48
źródło