3

This is the expected way for the awk field separator to work:

$ echo 'fooXbar' | awk 'BEGIN {FS="X"} {print $1}'
foo
$ echo 'fooXbar' | awk 'BEGIN {FS="X"} {print $2}'
bar
$ 

but if the FS is "-|-" then things get strange:

$ echo 'foo-|-bar' | awk 'BEGIN {FS="-|-"} {print $1}'
foo
$ echo 'foo-|-bar' | awk 'BEGIN {FS="-|-"} {print $2}'
|
$ echo 'foo-|-bar' | awk 'BEGIN {FS="-|-"} {print $3}'
bar
$ 

Why? Why is the $2 a "|" in the second example??

UPDATE:

$ echo 'foo-|-bar' | awk 'BEGIN {FS="-\|-"} {print $2}'
awk: warning: escape sequence `\|' treated as plain `|'
|
$ 
1
  • 3
    Multi-character field separators are treated as regular expressions in awk. You should always escape them appropriately if you want the literal meaning.
    – Chris Down
    Commented Feb 23, 2014 at 13:29

1 Answer 1

8

FS is a regex: awk interprets -|- as "- or -".

Use -\|- instead. You'll need to double the backslash inside the string literal.

echo 'foo-|-bar' | awk 'BEGIN {FS="-\\|-"} {print $1}'

or

echo 'foo-|-bar' | awk -F '-\\|-' '{print $2}'
0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .