Não funciona para mim com as barras invertidas, mas posso explicar isso para você:
echo "$PATH" | awk 'NF && !x[$0]++' RS='[:|\n]'
O separador de registro ( RS
) é definido como um dos caracteres ":", "|" e nova linha. $PATH
é geralmente apenas uma linha com elementos separados por ":". Isso faz o awk se comportar como se os caminhos não fossem separados por ":", mas cada um em sua própria linha.
NF
significa que linhas vazias ( NF == 0
) são ignoradas. x
é uma matriz associativa com os caminhos como subscrito. !x[$0]++
significa que a "linha" é ignorada se x[$0]
for maior que 0. O resultado é que cada linha é enviada apenas uma vez. Durante a primeira execução, x[$0]
é aumentado para que, nas execuções a seguir, !x[$0]
seja falso.
Este exemplo mostra a frequência de todos os elementos após a última linha ter sido processada:
echo "a:b:a:c:a:b" |
awk 'NF && !x[$0]++;END {for (var in x) print var ": " x[var]}' RS='[:|\n]'
a
b
c
a: 3
b: 2
c: 1