awk a 0 的命令解析

2021-10-06 09:42:32 字數 1102 閱讀 6557

昨天晚上遇到乙個問題,需要將資料指定列在不打亂順序的前提下刪除重複元素,所以搜尋到了這個命令

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...