昨天晚上遇到乙個問題,需要將資料指定列在不打亂順序的前提下刪除重複元素,所以搜尋到了這個命令
awk
'!a[$0]++'
file
但是我心裡面一直很癢癢的,就是很想知道為什麼他能夠這麼做。
首先看的書籍《linux 命令列與shell指令碼程式設計大全》第三版,找到陣列的定義,其實這也是我理解這個命令至今都無法明白的問題,但是其他的我都基本搞清楚了。
首先我們觀察命令 awk 『!a[$0]++』 file
有以下元素
a
[$0]
!
++
其中! 和 ++ 涉及到運算子優先的問題,
查閱資料知道++運算級別高於 !
接下來問題就是 假設 a = a[$0]
如果a = 1,
a++, 與++a是不一樣的結果。
a++ 代表先賦值後運算,++a是先自增再賦值
最後a[$0]的問題我沒有完全弄明白。
假設我的檔案 file
cat
file
111222
111222
# 執行命令
awk''
# 結果
0 10 1
1 21 2
這裡我理解為 一開始 a = a[$0] = a[111] = 0
因為我一開始的陣列裡面沒有 111,所以我的key[111] = value 0,但是
我隨後進行了自增 a = a+1 = 1 ,那麼我之後再遇到 key[111] ,a=1了。
這樣!a = 0. 如果這個時候執行 awk 『0』 file 以及 awk 『1』
file,我理解為一種條件判斷,如果真,那麼 執行預設列印操作 print $0,
否則 什麼都不列印。
這樣就很清楚了,凡是遇到指定列的元素,如果不是第乙個,只要 a>=1,那麼 !a = 0,awk 既然是按照行處理的文字,那麼 awk 就不會再次列印,只會列印自己第一次遇到的檔案,即是檔案指定列的第乙個不重複元素。
深入理解 awk a 0 去重
深入理解 awk a 0 去重 root vm 39 7 centos a 0 root vm 39 7 centos echo a 0 root vm 39 7 centos echo a 0 root vm 39 7 centos echo a 1 root vm 39 7 centos awk...
詳細解析Linux scp命令的應用
2010 03 08 10 49 佚名 網際網路 字型大小 t t linux命令有人統計說是有4000多個,linux scp命令是用於linux之間複製檔案和目錄,這裡詳細介紹scp命令使用和引數。ad linux scp命令用於linux之間複製檔案和目錄,具體如何使用這裡好好介紹一下,從本地...
詳細解析Linux scp命令的應用
linux scp命令用於linux之間複製檔案和目錄,具體如何使用這裡好好介紹一下,從本地複製到遠端 從遠端複製到本地是兩種使用方式。這裡有具體舉例 linux scp 命令 scp 可以在 2個 linux 主機間複製檔案 命令基本格式 scp 可選引數 file source file tar...