How can I add a Column of values in a file which has a certain number of rows.
I have a input file like this:
Input file:
SPATA17 1 217947738 LYPLAL1 1 219383905 FAM47E 4 77192838 SHROOM3 4 77660162 SHROOM3 4 77660731 SHROOM3 4 77662248
Output file:
SPATA17 1 217947738 file1 LYPLAL1 1 219383905 file1 FAM47E 4 77192838 file1 SHROOM3 4 77660162 file1 SHROOM3 4 77660731 file1 SHROOM3 4 77662248 file1
In this case, I want to add a Column of values, upto the number of rows in the file.The value remains consistent, such as “file1”.
The reason is I have 100 of those files.I don’t want to open each file and paste a column.
Also is there any way to automate this, by going in a directory and adding a column of values.
The value comes from the filename, which has to be added in each row of the file in the last/first column.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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
-iflag withsedto 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 ist(= a TAB), and$fis the filename, from the loop variable. Thes///command is within double-quotes so that the shell can expand variables.
Method 2
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
Method 3
You can use awk:
awk '{print $0, FILENAME}' file1 file2 file3 ...
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0