7

I am trying to use awk to cut with multi-character delimiter

echo 'f1##f2' |awk -F '##' '{print $2}'

It prints f2. Whereas

echo 'f1||f2' |awk -F '||' '{print $1}'

prints f1||f2.

Can anyone explain what is going on?

  • I'm surprised that GNU awk allows that at all. BSD awk throws an error, awk: illegal primary in regular expression || at |, as does mawk, mawk: line 0: regular expression compile failed (missing operand). – Kusalananda Sep 12 '17 at 15:48
  • @Kusalananda, the behaviour is unspecified by POSIX. The GNU behaviour is more useful and makes more sense IMO. It makes more sense to me to have (foo|bar|) be like (foo|bar)? rather than returning an error. That's also what perl REs do. ? in zsh globs is done that (? meaning something different in globs) – Stéphane Chazelas Sep 12 '17 at 18:51
11

The vertical bar char | is treated as special character in your case and should be escaped:

echo "f1||f2" |awk -F'\\|\\|' '{print $1}'
f1

As an alternative you may put | into the character class:

echo "f1||f2||f3" |awk -F'[|]{2}' '{print $3}'
f3
  • Why escape it twice? – pfnuesel Sep 12 '17 at 15:59
  • 1
    @pfnuesel, because with this -F'\\||' you'll get empty {print $2} (second field) – RomanPerekhrest Sep 12 '17 at 16:02
  • 2
    @ctrl-alt-delor, FYI: linguistically | IS "vertical bar" char (not OR character), semantically - in some context it's logical OR operator, in some other context - regex alternation operator – RomanPerekhrest Sep 12 '17 at 16:34
  • 1
    @ctrl-alt-delor Adding to the comment of RomanPerekhrest: Calling | an OR character is confusing because there is an actual OR character which is different: "∨" (Logical Or, U+2228, in Unicode block Mathematical Operators ). (In some fonts, it may look almost like the alphabet letter V in uppercase. It should be larger and have a larger angle.) – Volker Siegel Sep 13 '17 at 1:27
  • @VolkerSiegel I was talking about its meaning in the language not the character name. In a regexp it is apparently called alternation, though I call it OR (not logical OR). – ctrl-alt-delor Sep 13 '17 at 8:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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