42

Is there a way to create out of thin air, a file that is a sequence of numbers, starting at a given number, one per line?

something like

magic_command start 100 lines 5 > b.txt

and then, b.txt would be

100
101
102
103
104
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
Duck
  • 4,434
  • 19
  • 51
  • 64

5 Answers5

67

There is already a command for this:

seq 100 104

will print these numbers on separate lines:

100
101
102
103
104

So just direct this output into a file:

seq 100 104 > my_file.txt

and seq 100 2 104 will print in increments of two, namely: 100, 102, 104

don_crissti
  • 79,330
  • 30
  • 216
  • 245
neuron34
  • 1,256
  • 8
  • 5
  • wooooooooooooooooooooooooooooooooooooooowwwwwwwwwww, you are a genius. That's it. I love unix more every second! Thanks. – Duck Nov 28 '11 at 23:55
  • is there a place where I can learn about little gems like seq? I am interested in commands that can create stuff out of thin air, like sequence of numbers, files that contain the same text line x times, commands that can generate sequence of letters "a, b, c, d..", stuff like that. thanks – Duck Nov 28 '11 at 23:58
  • @DigitalRobot: At some point you're probably going to find yourself just writing perl one-liners. – Cascabel Nov 29 '11 at 05:00
  • 1
    @SpaceDog Your love is misplaced. `seq` is from GNU Coreutils, not Unix. GNU even stands for GNU is Not Unix! – Kaz Nov 06 '15 at 05:12
13

Linux ships with the seq command which does exactly that. If you don't have the seq command, it's an easy one-liner:

i=100; while [ $i -le 104 ]; do echo $i; i=$((i+1)); done >b.txt

or in ksh/bash/zsh

for ((i=100; i<=104; i++)); do echo $i; done >b.txt

or in zsh

print -l {100..104} >b.txt
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
9

bash:

printf '%s\n' {100..105}

perl:

perl -le 'print for 100..104'

bc:

echo 'for (i = 100 ; i <= 104 ; ++i) i' | bc

dc:

echo '100 104 sb [p 1 + d lb !<m] sm lm x' | dc
1

If you don't mind a space in front of most of them:

echo -e {100..104}\\n >numbers-file.txt

Without the space but with an extra command:

echo {100..104} | sed 's/ /\n/g' >numbers-file.txt

Edit for a bonus vim command (open vim):

i100[esc]qqyyp[ctrl-a]q2@q:w numbers-file.txt

For more numbers, increase 2 accordingly.

Kevin
  • 40,087
  • 16
  • 88
  • 112
  • 1
    You can use printf(1) to not get the space at the start of the line: `printf '%s\n' {100..104}` – camh Nov 29 '11 at 07:39
1

Besides using seq, while, for, printf, perl, echo as shown in previous example, you can also use Python

python -c "print list(range(100,105))"

Example:

[user@linux ~]~ python -c "print list(range(100,105))"
[100, 101, 102, 103, 104]
[user@linux ~]~