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?
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?
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.
-d argument).
– Ahmed Fasih
Nov 04 '14 at 14:40
ksh93, not bash. That's supported by ksh93, zsh, bash, mksh and FreeBSD sh at least (it might make it to the next major reversion of the POSIX standard specification for sh).
– Stéphane Chazelas
Oct 23 '17 at 11:42
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 can just write
cut -f 2
cut for Windows would not follow the complete standard.
– willeM_ Van Onsem
Apr 19 '15 at 12:32
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 '19 at 20:37
cut -f 2 is way more readable than cut -d' ' -f 2 or cut -d$'\t' -f 2
– Mouradif
Jun 21 '19 at 10:10
awk -F '\t' '{ print $2 }' inputfile
This extracts the second tab-delimited field of each line of input from inputfile.
cut. Moreover, cut(1) is waaay faster than awk(1).
– Tripp Kinetics
May 14 '20 at 19:10
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.
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.
– G-Man Says 'Reinstate Monica'
Mar 26 '19 at 20:26
echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
– Brent Bradburn
Mar 26 '19 at 22:29
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}"
}
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
"\t" is interpreted by the shell, which does understand backslash-escapes, and $(...), and ... What's your $SHELL or getent passwd $(id -u) | cut "-d:" -f6. Also cat --show-all datafile | head -n 10. Please [edit] your question to add whatever information you get. Do not use Add Comment.
– waltinator
Sep 02 '23 at 23:15
printf '%s\t%s\t%s\n' 1 2 3 | cut -d "\t" -f 2 (will not extract the 2 in the 2nd column). Just use cut without the -d option (tab is the default delimiter).
– Kusalananda
Sep 03 '23 at 07:56
cut fails when given -d "\t" or "-d\t": “cut: the delimiter must be a single character”.
– Stephen Kitt
Sep 06 '23 at 10:29