Re: How to exchange two columns in a table?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thank you! It's just a tab-delimited text file.


Ah, okay.  There are a couple different ways to do it:

1) with sed:

sed 's/^\([^\t]*\t[^\t]*\t\)\([^\t]*\t\)\([^\t]*\t\)\(.*\)/\1\3\2\4/'

That's a bit ugly, but fairly easy to modify. There are four things wrapped in "\(...\)". The first pair contains a "[^\t]*\t" for each field to be skipped before the column of interest. The second and third pairs simply snag the contents of the column you want. The fourth pair snags the remainder of the line. It then does a substitution, stitching those parts back together, swapping the 2nd and 3rd grouping (the columns of interest).

2) with awk:
awk '{
	output = "";
	split($0, a);
	temp=a[3]; a[3]=a[4]; a[4]=temp;
	for (i=1; i <= length(a); i++){
		if (i-1) output = output "\t";
		output = output i a[i]};
		print output
	}'

The advantage to the awk version is that it is easier to read (it's much easier to tell that this is swapping columns 3 and 4 compared to the sed version), and easier to modify. You can even put that statement (the contents of the quote) in a file such as "swapcols.awk" and call it with

	awk -f swapcols.awk in.txt > out.txt

Or even prefix the file with a shebang line, something like

	#!/usr/bin/awk -f

and make the file executable if you plan to swap the same two columns more than once.

3) with Python

>>> outfile = file("out.txt", "w")
>>> for line in file("in.txt"):
...	data = line.rstrip('\n').split('\t')
...	data[3],data[4] = data[4],data[3]
...	outfile.write('\t'.join(data))
...	outfile.write('\n')

The python version can be made to be a full-fledged program if desired, that will take the two column-offsets (and perhaps even an optional delimiter) and swap the columns as desired. Write back if you want this, and I can whip it up fairly quickly.

4) with Perl (it can be done, but I'm not a perl wonk, so some of the smarter Perl users on the list will have to help you here)

Hope this gives you some ideas to work with...

-tim




_______________________________________________
Blinux-list mailing list
Blinux-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/blinux-list

[Index of Archives]     [Linux Speakup]     [Fedora]     [Linux Kernel]     [Yosemite News]     [Big List of Linux Books]