shell 之awk 關聯陣列高階應用

2022-09-16 12:06:09 字數 857 閱讀 1592

最近由於資料遷移過,有些使用者資訊需要再次確認下,也許資料量比較大,但是需要最終確認的比如說是使用者id和其對應的使用者積分數,這樣就會導致出現文字a(老的資料),文字b(新的資料)。比如

1101

1231102

1111103

1451104

152

這是文字a.txt

文字b.txt如下

1101

1231102

1121103

1541104

152

列舉的文字例子只是為了說明使用方法列舉的最簡單的文字,實際資料可能要複雜的多,可能會出現b.txt **現的id在a.txt中沒有出現等等情況,這裡只是為了說明awk 關聯陣列的高階應用,方便大家理解。

我們會發下b.txt中的id 為1102 和1103 使用者的積分數與先前的是不同的,那麼如何通過shell 來處理呢?下面介紹強大的文字工具awk:

提取兩個文字中第二列相同並將積分進行合併:

awk 'nr=fnrnr!=fnr' a.txt b.txt 可以得到如下結果:

1101

123123

1104

152152

其中nr,fnr都為awk的內建的資料變數,其中nr為含處理過的所有的資料行總數,fnr為處理過的當前資料檔案中的資料行的總數。簡單的來說可以這麼理解nr為執行讀取兩個文字行的總數,而fnr為讀取第乙個文字行的數量,所以判斷條件可以通過「!=」也可以通過「>」來判斷。而a[$1]=$2為將第乙個文字行中第二個字段賦值給陣列a,然後當處理到第二個文字時,可以利用已經賦值的陣列進行判斷進行有條件的輸出。

然後第二列積分數不同的以此類推即可。

linux下awk的關聯陣列

昨天看了同事的乙個shell指令碼,如下 awk nr fnra 1 0 a.txt b.txt 作用是 列印出b.txt第一列中不在a中行,初一看,不是很懂,shell指令碼沒有系統的學過,平時用也只是一些簡單的執行下可執行程式,跑下定時任務 nr和fnr,nr列印行數,fnr同樣是列印行數,區別...

1215 關聯陣列

一 陣列變數的限制 在前面講的陣列變數中,可以通過下標訪問其中的元素。例如,下列語句訪問陣列 array 的第三個元素 scalar array 2 雖然陣列很有用,但它們有乙個顯著缺陷,即很難記住哪個元素存貯的什麼內容。假如我們來寫乙個程式計算某檔案中首字母大寫的單詞出現的次數,用陣列來實現就比較...

9 3 關聯陣列

關聯陣列是bash 4.0新增的乙個特性。關聯陣列將值與索引連線 關聯 到一起,所以我們可以將元資料與實際資料關聯起來。使用這種方式可以將 家與他的樂器聯絡起來。關聯陣列必須以大寫的declare a命令來進行宣告。cat musicians.sh bin bash declare a beatle...