Recently I explored seq
and paste
Linux commands and I was amazed how effectively we can accomplish our desired target of adding a sequential numbers to the beginning of a file without using any for
loop or manipulating the data file line by line.
Lets dive in to see how we can leverage these two commands.
seq [n]
generates sequential numbers starting from 1 to n.
seq 10 # Output # 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10
We can redirect the output of the command to a file, say, serial
.
seq 1024 > serial wc -l serial # Output # 1024 serial
The second command we are going to explore is paste
. The command uses two or more files to produce an output separated by whitespace
in columns.
Lets say we have a cities
file with names of different cities in it
Prague Montreal Amsterdam Rome Barcelona
and a serial
file with the following numbers
1 2 3 4 5
Lets use paste
command on serial
and cities
files.
paste serial cities # Output # 1 Prague # 2 Montreal # 3 Amsterdam # 4 Rome # 5 Barcelona
As we can see the output is separated by a whitespace
. We will see how we can modify the delimiter shortly.
Wind things up
Lets put 2 commands together to accomplish our target.
Suppose we have a CSV file mock.csv
with the following content
Ryder,eget.metus.In@congueturpis.com,El Quisco Keelie,vel.faucibus.id@libero.net,Temuka Hamilton,enim.non.nisi@Maecenas.co.uk,Leeds Lani,neque.sed.dictum@et.net,Largs Gloria,montes.nascetur@nisl.co.uk,Vejalpur
and we wish to add sequential numbers to the beginning of the file. Here is the final bash script.
#!/bin/bash # Generate sequence of numbers (1 to 5) seq 5 > serial # Use paste to combine two files with comma as a delimiter paste -d, serial mock.csv > data.csv cat data.csv # Output # 1,Ryder,eget.metus.In@congueturpis.com,El Quisco # 2,Keelie,vel.faucibus.id@libero.net,Temuka # 3,Hamilton,enim.non.nisi@Maecenas.co.uk,Leeds # 4,Lani,neque.sed.dictum@et.net,Largs # 5,Gloria,montes.nascetur@nisl.co.uk,Vejalpur
Viola!!! That was simple and elegant. Note that we have used -d,
option with paste
to indicate the delimiter to be ,
rather than a whitespace
.
Note that we have hard coded 5
as an argument to seq
command because we know beforehand that mock.csv
contains 5
rows. What if we don't know the number of rows in the CSV file? Simply use wc -l
command and extract the number of lines using awk
or cut
.
LINES=$(wc -l mock.csv | awk ' {print $1} ') # LINES=$(wc -l mock.csv | cut -d ' ' -f1) # Use LINES variable as an argument to seq command seq $LINES
That's it.
I hope it will help you. Keep Coding!
Top comments (0)