Neuroguy
Neuroguy

Reputation: 141

problems transposing columns using cut

I want to transpose a 3-column text file to three separate files with one line each. In other words, take this file:

in_file

1   22  0.8
4   21  0.73
3   30  1.56
5   12  0.92

and produce the following 3 files:

out_file1

1   4   3   5

out_file2

22  21  30  12

out_file3

0.8 0.73    1.56    0.92

I tried to use cut to do this:

cut -d' ' -f1 in_file | tr -s '\n' '\t' >> out_file1
cut -d' ' -f2 in_file | tr -s '\n' '\t' >> out_file2
cut -d' ' -f3 in_file | tr -s '\n' '\t' >> out_file3

however, what I get is this:

out_file1

1   4   3   5

out_file2

22  21  30  12

out_file3

0.8
    0.73
    1.56
    0.92

I can't figure out why it works for the first 2 columns and not the third.

Grateful for any help!

Upvotes: 0

Views: 455

Answers (2)

Olli K
Olli K

Reputation: 1760

Your problem is most likely the delimiter which you've typed as a literal tab instead of \t, here's a loop that does all three files:

for i in {1..3}; do
    cut -d$'\t' "-f${i}" in_file | column >> "outfile_${i}.txt"
done

Here we loop over a sequense of {1..3}, set the delimiter to tab with the special syntax: -d$'\t', pipe the data to column which automatically lines up the values and append that to the correct file.

Upvotes: 1

NeronLeVelu
NeronLeVelu

Reputation: 10039

A bit faster if awk is availble

awk '{ for( i=1; i<=NF; i++) printf( "%s ", $i) > ("file" i)}' YourFile

note: - > and not >> because awk evaluate the redirection only at file opening (so creation and not add in this case)

for your cut problem, is separator always 1 space char between column

Upvotes: 0

Related Questions