TL;DR: We won't do any testing with tabs as delimiters. :)

Setting that aside, the first two questions to ask are (1) Are you sure the input file has tabs? and (2) How are you specifying a tab on the command line?

Just for this question I added a file with tabs to the a3 directory. Let's use cat -vet to look at it on lectura:

$ cat -vet /cs/www/classes/cs372/spring14/a3/xf.1.tabs 
one^I1^I1.0^M$
two^I2^I2.0^M$
three^I3^I3.0^M$
four^I4^I^I^I4.0^M$
twenty^I^I^I20^I^I^I^I20.0^M$

The control-Is are tabs. The control-Ms are carriage returns. The dollar signs show the exact end of the line.

With no options to cat we see this: (now using my $a3 shell variable—see @29 to see how to set variables in bash)

$ cat $a3/xf.1.tabs
one     1       1.0
two     2       2.0
three   3       3.0
four    4                       4.0
twenty                  20                              20.0

We can use Ruby to show exactly what's in a file like this:

$ ruby -e "p STDIN.read" < $a3/xf.1.tabs
"one\t1\t1.0\r\ntwo\t2\t2.0\r\nthree\t3\t3.0\r\nfour\t4\t\t\t4.0\r\ntwenty\t\t\t20\t\t\t\t20.0\r\n"

The -e argument specifies the whole program. The program, p STDIN.read, reads all of standard input and then uses p to show it.

In the output \t is a tab, \r is a carriage return and \n is a newline (a.k.a. linefeed)

Here's one way to specify a tab on the command line with bash:

$ ruby $a3/echo.rb $'\t'
1 arguments:
argument 0 is ' '

The tab is not easy to see—it's the white space between the apostrophes, and because of the column it falls in, it's shown as being one column wide.

Let's see what cat -vet and Ruby show:

$ ruby $a3/echo.rb $'\t' | cat -vet
1 arguments:$
argument 0 is '^I'$

$ ruby $a3/echo.rb $'\t' | ruby -e "p STDIN.read"
"1 arguments:\nargument 0 is '\t'\n"

With all that in hand, let's run xfield:

$ ruby xfield.rb -d$'\t' 3 1 < $a3/xf.1.tabs
1.0     one
2.0     two
3.0     three
4.0     four
20.0    twenty

Again, we won't test with tabs as delimiters but if your program works with -dx I think you'll find it naturally works with -d$'\t', too. Outputting tabs is interesting but for nput they're just another character.