331

Here is an example of using cut to break input into fields using a space delimiter, and obtaining the second field:

cut -f2 -d' '

How can the delimiter be defined as a tab, instead of a space?

2

6 Answers 6

450

Two ways:

Press Ctrl+V and then Tab to use "verbatim" quoted insert.

cut -f2 -d'   ' infile

or write it like this to use ANSI-C quoting:

cut -f2 -d$'\t' infile

The $'...' form of quotes isn't part of the POSIX shell language (not yet), but works at least in ksh, mksh, zsh and Busybox in addition to Bash.

8
290

Tab is the default.

See the cut man page.

-d delim
         Use delim as the field delimiter character instead of the tab
         character.

So you should just write

cut -f 2
6
  • 3
    Oops didn't notice that line. Mar 30, 2012 at 15:54
  • 4
    But it is probably always safer to mention such flags explicitly, for both readability and portability. I can imagine some people designing a cut for Windows would not follow the complete standard. Apr 19, 2015 at 12:32
  • 5
    This should be accepted answer: simplest code, simplest explanation. ya nailed it: youtube.com/watch?v=dpNTHl7y45Y
    – neuronet
    Jun 16, 2016 at 21:28
  • 18
    This answer has changed my life
    – matheeeny
    Apr 28, 2017 at 13:00
  • 4
    @WillemVanOnsem, if someone writes a version of cut for Windows and doesn't follow the POSIX specification for it, there is no reason to assume that any POSIX script will work with that system. Stick to POSIX-specified features. Don't try to allow for hypothetical future non-compliant implementations; that's not what "portability" means.
    – Wildcard
    Mar 26, 2019 at 20:37
17
awk -F '\t' '{ print $2 }' inputfile

This extracts the second tab-delimited field of each line of input from inputfile.

1
  • 2
    The OP was specifically asking about cut. Moreover, cut(1) is waaay faster than awk(1). May 14, 2020 at 19:10
11

More generically, without requiring any invisible characters: Use tr to convert the delimiters to a format that can be specified more easily to cut.

$ echo -e "a\tb\tc" |tr '\t' ' ' |cut -d' ' -f2
b

tr is a simple, but powerful, character matching and replacement tool.

3
  • 1
    But what if the input is abc(space)def(tab)ghi? Your answer will yield def, but it should yield ghi.  Similarly, if the input is ABC(tab)DEF(space)GHI, your answer will yield DEF, but it should yield DEF(space)GHI. Mar 26, 2019 at 20:26
  • @G-Man: The space delimiter was only an example. Use whatever delimiter is appropriate for your data -- a comma for example. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2 Mar 26, 2019 at 22:29
  • 1
    ...But, yeah, if the delimiter must be a tab, then my approach won't work. Mar 27, 2019 at 0:04
0

Alternatively, one could wrap cut in a function.

function getColumns ()
{
    local -r delimiter="${1:?}"
    local -r columns="${2:?}"

    if [[ "$delimiter" == '\t' || "$delimter" == "tab" ]]; then
        cut "--fields=${columns}"
        return
    fi

    cut "--delimiter=${delimiter}" "--fields=${columns}" 
}
2
  • @ilkkachu Interesting thought, but this works. Oct 17, 2021 at 19:36
  • sigh, yes, I can't read.
    – ilkkachu
    Oct 17, 2021 at 19:59
0

I use TAB and cut in these ways:

# quote the whole thing, use TAB escape
cut "-d\t" -f 2
# just quote the tab escape 
cut -d "\t" -f 2
# Use Ctrl-V to quote Ctrl-I (TAB is Ctrl-I, see man ascii)
cut -d^V^I -f 2

Not the answer you're looking for? Browse other questions tagged or ask your own question.