2013-03-14 20 views
1

我想根據列刪除文件中的重複行。快速搜索,讓我this page其中有以下解決方案:關聯數組如何在awk中工作?

awk '!x[$1]++' filename 

它的工作原理,但我不知道它是如何工作。我知道它在awk中使用關聯數組,但我無法推斷出任何超出它的東西。

更新

感謝大家的解釋。憑藉我的新知識,我已經寫了一篇blog post的進一步解釋,說明它是如何工作的。

回答

3

awk腳本!x[$1]++填充名爲x的數組。假設文本行中的第一個單詞($1引用一行文本中的第一個單詞)爲line1。它有效地導致在該操作在陣列上:

x["line1"]++ 

「索引」的陣列的(關鍵)是文件(line1在這個例子中)中所遇到的文本,並與該鍵相關聯的值是一個遞增1的整數。

當遇到唯一的文本行時,數組的當前值爲零,然後後遞增爲1. not運算符!計算結果爲非零(true )爲每一個新的獨特的文字行打印。下一次遇到相同的值時,數組中的值不爲零,因此操作結果爲零(false),因此不會打印該行。

寫一樣的東西(但可能更清晰,樂趣卻少)的少「聰明」的方法是這樣的:

{ 
if (x[$1] == 0) 
    print 
x[$1]++ 
} 
+0

感謝您的解釋。所以如果'awk'表達式要返回true,那麼這行會被打印出來,我們不必顯式調用print?而且這裏的'x'只是一個可以用其他任何東西替換的變量名? – Sudar 2013-03-14 19:50:35

+0

是的,你在兩個假設都是正確的。 – 2013-03-14 19:53:55