Explain this duplicate line removing, order retaining, one-line AWK command
awk, command-line, unix
Solution
The expression is parsed as
!(x[$(1)]++)
So, from the inside out, it's:
- Take field 1 of the current input line, `$(1)` (note that `$` is an operator in AWK, unlike in Perl).
- Index `x` with the value of field 1; if `x` is an unbound variable, bind it to a new associative array.
- Post-increment `x[$(1)]`; a rule similar to the one in C applies, so the value of the expression is that of `x[$(1)]` prior to the increment, which will be zero if `x[$(1)]` has not yet been assigned a value.
- Negate the value of the previous, which will yield truth when `x[$(1)]` is zero.
- Actually do the increment so that `x[$(1)]` gets a non-zero value. So, the next time, `x[$(1)]` for the same value of `$(1)` will return 1.
This expression is then evaluated for every line in the input and determines whether the implied default action of `awk` should be executed, which is to echo the line to `stdout`.
Problem
I learned a really handy way to remove duplicate lines retaining the order from Remove duplicates without sorting file - BASH. Say, if you have the following file, ``` $cat file a a b b a c ``` you can use the following to remove the duplicate lines: ``` $awk '!x[$1]++' file a b c ``` How does this work in terms of precedence of operations?