web-dev-qa-db-ja.com

すべて同じ幅を持つようにbashで整数のシーケンスをゼロ埋めするにはどうすればいいですか?

いくつかの値をループする必要があります、

for i in $(seq $first $last)
do
    does something here
done

$first$lastの場合、固定長5である必要があります。したがって、入力が1の場合は、00001になるようにゼロを追加する必要があります。たとえば99999までループしますが、長さは5でなければなりません。

例:000020004200212012312など。

どのように私はそれを行うことができますかについての任意のアイデア?

347
John Marston

あなたの特定のケースでは、リストを出力するときに数字をフォーマットするためにseq-fフラグを使うのがおそらく最も簡単です。例えば:

for i in $(seq -f "%05g" 10 15)
do
  echo $i
done

次のような出力が得られます。

00010
00011
00012
00013
00014
00015

より一般的には、bashは組み込みとしてprintfを持っているので、次のように出力にゼロを埋め込むことができます。

$ i=99
$ printf "%05d\n" $i
00099

-vフラグを使用して、出力を別の変数に格納することができます。

$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099

printfseqとは少し異なるフォーマットをサポートしているので、%05dの代わりに%05gを使用する必要があります。

586
Dave Webb

もっと簡単

for i in {00001..99999}; do
  echo $i
done
113
Indie

シーケンスの終わりに最大の長さのパディングがある場合(例えば、5桁が必要でcommandが "seq 1 10000"の場合)、seqに "-w"フラグを使用するよりもパディング自体が追加されます。

seq -w 1 10

作物

01
02
03
04
05
06
07
08
09
10
73
m_messiah

printfに "%05d"を指定してください。

printf "%05d" 1
68
frankc

printfを使うととても簡単

[jaypal:~/Temp] printf "%05d\n" 1
00001
[jaypal:~/Temp] printf "%05d\n" 2
00002
16
jaypal singh

次のようにawkを使用します。

awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}'

出力:

00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

更新:

純粋なbashの代替として、これを実行して同じ出力を取得できます。

for i in {1..10}
do
   printf "%05d\n" $i
done

この方法で、外部プログラムseqを使用してavoidできます。これは、* nixのすべてのフレーバーで利用不可です。 。

12
anubhava

必要以上の桁数(ゼロ)で出力を埋め込み、それからtailを使って探している桁数だけを使います。最後の5桁を取得するには、末尾に '6'を使用する必要があります。

for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done
8
unifex

N桁が必要な場合は、10 ^ Nを追加して最初の桁を削除します。

for (( num=100; num<=105; num++ ))
do
  echo ${num:1:3}
done

出力:

01
02
03
04
05
4

他の方法 :

zeroos="000"
echo 

for num in {99..105};do
 echo ${zeroos:${#num}:${#zeroos}}${num}
done

そのため、任意の数値を変換するための単純な関数は次のようになります。

function leading_zero(){

    local num=$1
    local zeroos=00000
    echo ${zeroos:${#num}:${#zeroos}}${num} 

}
1
Paco

これも動作します:

for i in {0..9}{0..9}{0..9}{0..9}
do
  echo "$i"
done
1
Chris

固定長を達成するために数字をゼロで埋めた直後の場合は、10の最も近い倍数を追加するだけです。 2桁の場合、10 ^ 2を追加し、出力を表示する前に最初の1を削除します。

このソリューションは、forループを使用して、任意の長さの単一の数字、または数字のシーケンス全体をパディング/フォーマットするために機能します。

# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf

pad=100000      ;# 5 digit fixed

for i in {0..99999}; do ((j=pad+i))
    echo ${j#?}
done

Mac OSX 10.6.8、Bash ver 3.2.48でテスト済み

0
Zimba

1.)1から1000までの数列 'seq'を作成し、幅 '-w'を固定します(幅は終了数の長さ、この場合は1000の場合は4桁で決まります)。

2.)また、 'sed -n'を使用して必要な番号を選択します(この場合は、1から100までの番号を選択します)。

3.)各番号を「エコー」します。数字は変数 'i'に格納され、 '$'を使ってアクセスされます。

長所:このコードはとてもきれいです。

短所: 'seq'はすべてのLinuxシステムに固有のものではありません(私が理解しているように)

for i in `seq -w 1 1000 | sed -n '1,100p'`; 
do 
    echo $i; 
done
0
nick