Jos*_*osh 5 tcsh path awk text-processing
我在.cshrc
几台机器上的 init 文件中看到过这段代码。我通过一些 awk 教程试图了解它是如何工作的,但我仍然无法解密它。
setenv PATH `echo $PATH | awk 'NF&&\\!x[$0]++' RS='[:|\n]' | paste -sd:`
Run Code Online (Sandbox Code Playgroud)
它有什么作用?
使用反斜杠对我不起作用,但我可以向您解释这一点:
echo "$PATH" | awk 'NF && !x[$0]++' RS='[:|\n]'
Run Code Online (Sandbox Code Playgroud)
记录分隔符 ( RS
) 设置为字符“:”、“|”之一 和换行符。$PATH
通常只是一行,元素以“:”分隔。这使得 awk 的行为就像路径没有被 ":" 分隔,但每个路径都在自己的行上。
NF
表示NF == 0
忽略空行 ( )。x
是一个以路径为下标的关联数组。!x[$0]++
表示如果x[$0]
大于 0,则忽略“行” 。结果是每一行只输出一次。在第一次运行期间x[$0]
增加,以便在接下来的运行中!x[$0]
是假的。
此示例显示处理完最后一行后所有元素的频率:
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
Run Code Online (Sandbox Code Playgroud)