awk + ​​paste 用于清理路径?

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)

它有什么作用?

Hau*_*ing 6

使用反斜杠对我不起作用,但我可以向您解释这一点:

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)