Adding a Column of values in a tab delimited file
You can use a one-liner loop like this:
for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done
For each file in the list, this will use sed
to append to the end of each line a tab and the filename.
Explanation:
- Using the
-i
flag withsed
to perform a replacement in-place, overwriting the file - Perform a substitution with
s/PATTERN/REPLACEMENT/
. In this example PATTERN is$
, the end of the line, and REPLACEMENT is\t
(= a TAB), and$f
is the filename, from the loop variable. Thes///
command is within double-quotes so that the shell can expand variables.
Come on why you guys recommend those powerful tools when there's paste
command!
$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A 1
B 2
C 3
D 4
With a little trickery, you could use paste
for the OP's purpose. However, it will not replace the files inplace:
for f in file1 file2 file3; do
paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done
This will paste the respective filename as the last column of each file into new file filename.new
You can use awk
:
awk '{print $0, FILENAME}' file1 file2 file3 ...