38

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
1
  • 1
    no need to call it .txt
    – ixtmixilix
    Nov 29, 2011 at 23:41

5 Answers 5

63

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

4
  • wooooooooooooooooooooooooooooooooooooooowwwwwwwwwww, you are a genius. That's it. I love unix more every second! Thanks.
    – Duck
    Nov 28, 2011 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, 2011 at 23:58
  • @DigitalRobot: At some point you're probably going to find yourself just writing perl one-liners.
    – Cascabel
    Nov 29, 2011 at 5:00
  • 1
    @SpaceDog Your love is misplaced. seq is from GNU Coreutils, not Unix. GNU even stands for GNU is Not Unix!
    – Kaz
    Nov 6, 2015 at 5: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
3
  • 3
    I love zsh more and more every day. Nov 29, 2011 at 4:20
  • 1
    @Gilles your first example will continue forever because you never increment $i.
    – jamesbtate
    Nov 29, 2011 at 5:52
  • +1 for answering the question the OP would not have actually been able to ask ('i don't have seq, so i can't xyz') -- those sorts of answers are the real gems
    – ixtmixilix
    Nov 29, 2011 at 23:38
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
3
  • +1 never seen anyone use bc or dc like that before
    – ixtmixilix
    Nov 29, 2011 at 23:38
  • and it strikes me that your dc answer is uncommonly wry and upvote-worthy
    – ixtmixilix
    Nov 29, 2011 at 23:39
  • It was unnecessarily complicated, but not on purpose, so I have simplified it now. Nov 30, 2011 at 8:38
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.

1
  • 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, 2011 at 7: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 ~]~ 
1
  • creating a sequence of numbers, one per line... and btw, this only works with python2. Dec 5, 2017 at 15:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.