1
我想根據列刪除文件中的重複行。快速搜索,讓我this page其中有以下解決方案:關聯數組如何在awk中工作?
awk '!x[$1]++' filename
它的工作原理,但我不知道它是如何工作。我知道它在awk
中使用關聯數組,但我無法推斷出任何超出它的東西。
更新:
感謝大家的解釋。憑藉我的新知識,我已經寫了一篇blog post的進一步解釋,說明它是如何工作的。
我想根據列刪除文件中的重複行。快速搜索,讓我this page其中有以下解決方案:關聯數組如何在awk中工作?
awk '!x[$1]++' filename
它的工作原理,但我不知道它是如何工作。我知道它在awk
中使用關聯數組,但我無法推斷出任何超出它的東西。
更新:
感謝大家的解釋。憑藉我的新知識,我已經寫了一篇blog post的進一步解釋,說明它是如何工作的。
awk腳本!x[$1]++
填充名爲x
的數組。假設文本行中的第一個單詞($1
引用一行文本中的第一個單詞)爲line1
。它有效地導致在該操作在陣列上:
x["line1"]++
「索引」的陣列的(關鍵)是文件(line1
在這個例子中)中所遇到的文本,並與該鍵相關聯的值是一個遞增1的整數。
當遇到唯一的文本行時,數組的當前值爲零,然後後遞增爲1. not
運算符!
計算結果爲非零(true )爲每一個新的獨特的文字行打印。下一次遇到相同的值時,數組中的值不爲零,因此操作結果爲零(false),因此不會打印該行。
寫一樣的東西(但可能更清晰,樂趣卻少)的少「聰明」的方法是這樣的:
{
if (x[$1] == 0)
print
x[$1]++
}
感謝您的解釋。所以如果'awk'表達式要返回true,那麼這行會被打印出來,我們不必顯式調用print?而且這裏的'x'只是一個可以用其他任何東西替換的變量名? – Sudar 2013-03-14 19:50:35
是的,你在兩個假設都是正確的。 – 2013-03-14 19:53:55