我正在從zsh切換到bash,並且我需要生成一個bash腳本,可以刪除$PATH
中的重複條目,而不用重新排序條目(因此沒有sort -d
魔法)。 zsh有一些不錯的數組處理快捷方式,可以很容易地做到這一點,但我不知道bash中的這種快捷方式。我遇到了this answer,這讓我有90%的途徑在這裏,但有一個小問題我想更好地理解。看來,當我運行awk命令時,最後處理的記錄不正確地匹配模式。awk模式總是匹配最後一條記錄?
$ awk 'BEGIN{RS=ORS=":"}!a[$0]++' <<<"aa:bb:cc:aa:bb:cc"
aa:bb:cc:cc
$ awk 'BEGIN{RS=ORS=":"}!a[$0]++' <<<"aa:bb:cc:aa:bb"
aa:bb:cc:bb
$ awk 'BEGIN{RS=ORS=":"}!a[$0]++' <<<"aa:bb:cc:aa:bb:cc:" # note trailing colon
aa:bb:cc:
我不明白AWK不夠好,知道爲什麼它的行爲這樣,但我已經設法通過使用中間陣列,像這樣以解決此問題。
array=($(awk 'BEGIN{RS=":";ORS=" "}!a[$0]++' <<<"aa:bb:cc:aa:bb:cc:"))
# Use a subshell to avoid modifying $IFS in current context
echo $(export IFS=":"; echo "${array[*]}")
aa:bb:cc
這似乎是一個次優解但是,所以我的問題是:我做錯了什麼在導致最終記錄誤報匹配處理awk命令?
很好的例子,看看發生了什麼。但是你能解釋爲什麼一個新行被添加到字符串中嗎? –
這是bash正在做的事情,它實質上使'cmd <<<「字符串」行爲與echo「字符串」行爲相同「。 cmd',但沒有額外的命令('echo')和管道。 POSIX文本處理工具(sed,awk,grep等)只能保證在POSIX文本文件上工作,否則會得到未定義的行爲,所以如果文件或輸入流不以換行符結束,那麼它不是POSIX文本文件/流,以便尾隨換行符是產生預期/期望行爲所必需的。 –
謝謝!現在我對問題的原因有了更好的理解,這使我更接近於爲問題制定適當的解決方案。雖然這可能是一個小問題,但您的回答對我非常有幫助。 – Christopher