什麼使用awk
?你可以得到第一次出現真正簡單:
[[email protected] ~]$ cat data1
./501.res/1.bin
./503.res/1.bin
./503.res/2.bin
./504.res/1.bin
[[email protected] ~]$ awk 'BEGIN{FS="."} a[$2] {next} {a[$2]=1} 1' data1
./501.res/1.bin
./503.res/1.bin
./504.res/1.bin
[[email protected] ~]$
要通過一對夫婦的種種拿到最後出現你可以管:
[[email protected] ~]$ sort -r data1 | awk 'BEGIN{FS="."} a[$2] {next} {a[$2]=1} 1' | sort
./501.res/1.bin
./503.res/2.bin
./504.res/1.bin
[[email protected] ~]$
假設您正在使用「查找」和「grep的」 ,你可以這樣做:
find . -name \*.bin -type f -print | sort -r | awk 'BEGIN{FS="."} a[$2] {next} {a[$2]=1} 1' | sort
這是如何工作的?
的find
命令有許多有用的選項,包括通過水珠來選擇你的文件,選擇文件類型的能力,等等。它的輸出你已經知道了,並且成爲輸入sort -r
。
首先,我們對輸入數據進行反向排序(sort -r
)。這確保了在任何目錄內,編號最高的文件將首先顯示。那個結果被傳入awk。 FS是字段分隔符,它使得$2
變成諸如「/ 501」,「/ 502」等等的東西。awk腳本具有condition {action}
形式的部分,它們針對每一行輸入進行評估。如果缺少某個條件,則該操作會在每一行中運行。如果條件爲「1」並且沒有任何操作,則打印該行。所以,這個腳本被分解如下:
a[$2] {next}
- 如果陣列a
下標$ 2(即「/ 501」)存在,就直接跳到下一行。否則...
{a[$2]=1}
- 設置數組下標$ 2:1,因此,在今後的首要條件將評估爲真,那麼...
1
- 打印線。
這個awk腳本的輸出將是你想要的數據,但是以相反的順序。最後的sort
按照您期望的順序重新排列。
現在......這是很多管道,當你要求它在同一時間處理數百萬行輸入時,排序可能有點資源飢渴。這個解決方案對於少量的文件是完全足夠的,但是如果你處理的是大量的輸入,請告訴我們,我可以想出一個一體化的awk解決方案(這需要超過60秒來寫)。
UPDATE
每丹尼斯的明智的建議,我上面包括在AWK腳本可以通過改變它從
BEGIN{FS="."} a[$2] {next} {a[$2]=1} 1
雖然這是功能相同的改進,以
BEGIN{FS="."} $2 in a {next} {a[$2]} 1
,其優點是您只需定義數組成員而不是將值分配給它們,這可以節省內存或cpu de待你實施awk。無論如何,它更乾淨。
最好使用'{next}'中的$ 2來測試數組中元素的存在。這樣做不會簡單地通過引用它們來創建新的數組元素。這是我前幾天討論這件事時想說的話。順便說一句,如果你這樣使用'in',你可以做'{a [$ 2]}'而不是'{a [$ 2] = 1'',但是兩者都可以。 –
@丹尼斯威廉姆森,啊,現在我明白你在前些天得到了什麼。非常感謝指針。 :) – ghoti