使用你的榜樣,產生輸入來進行測試:
printf 'one\nfour\ntwo\nthree\nfour\n'
處理最簡單的方法是簡單地扭轉你的數據,兩次。在BSD和OS X中的以下工作:
command | tail -r | awk '!a[$0]++' | tail -r
但-r
選項是不具有普遍性。如果你是在Linux上,你可以生成與tac
命令(的cat
對面),這是的coreutils的一部分同樣的效果:
command | tac | awk '!a[$0]++' | tac
如果沒有這些作品的(即你在HP/UX或早期Solaris等),您可以使用sed
逆轉的事情:
command | sed '1!G;h;$!d' | awk '!a[$0]++' | sed '1!G;h;$!d'
當然,你可以用Perl也這麼做:
command | perl -e 'print reverse <>' | awk '!a[$0]++' | perl -e 'print reverse <>'
但是,如果Perl是您的系統上,你可能也簡化了管道,並跳過AWK完全:
command | perl -e '$a{$_}++ or print for reverse <>'
我從來沒有真正喜歡的perl,不過,我做像貝殼做的事情。如果你在bash(4或後續版本),你不那麼在意性能,您可以直接在你的shell執行數組:
mapfile -t a < <(command)
declare -A b;
for ((i=${#a[@]}-1 ; i>=0; i--)); do ((b[${a[$i]}]++)) || echo "${a[$i]}"; done
無需外部工具。 :-)
UPDATE:
靈感(或者挑戰)由sudo_O's answer,這裏是多一個選擇,在純AWK BSD上工作(即不需要GNU AWK):
command | awk '{a[NR]=$0;b[$0]=NR} END {for(i=1;i<=NR;i++) if(i==b[a[i]]) print a[i]}'
請注意,這將所有輸入存儲在內存兩次,因此它可能不適合大數據集。
注:perl的被髮明出來,以改善用awk + sed的+ shell + ... – Dogweather