Linux

你如何計算從 uniq -c 生成的第一列

  • April 27, 2018

我有一個文件,其中列出了 5 行隨機單詞“See spot”“See pot run”等,每行都在一個新行上。我能夠創建程式碼來計算每個單詞在文件中出現的次數並正確排序。

4 Spot  
3 run  
2 see  
1 sees  
1 Run  
1 Jane  

我使用的程式碼:

cat "FILENAME" | tr ' ' '\n' | sort -n | uniq -c | sort -r  

我將每個單詞放在一個新行上,排序,然後計算唯一值並再次排序。現在我必須計算這個數量,但是有這個輸出:

3 1  
1 2  
1 3  
1 4  

這意味著有 3 個單詞的計數為 1、1 個單詞 2、1 個單詞 3、1 個單詞 4。

我有2個問題。1 是如何獲得已經是 uniq -c 計數的第一列的計數。第二個問題是刪除第二列中的單詞並替換為原始計數 1, 2 ,3, 4。

你可以這樣做:

tr ' ' '\n' <infile \
| sort -n \
| uniq -c \
| awk '{ seen[$1]++ } END{for (x in seen) print seen[x], x }'

甚至:

tr ' ' '\n' <infile | sort -n | uniq -c|cut -d' ' -f7 |sort |uniq -c

或者更好地awk單獨使用:

awk '{ seen[$0]++ } 
   END{ for (x in seen) count[seen[x]]++; for (y in count) print count[y],y }
' RS='( |\n)+' infile
3 1
1 2
1 3
1 4

在上面awkseen[$0]++對於每個記錄,用空格或ewline分隔的****S\n將整個記錄儲存到稱為鍵的關聯數組seen中,當再次看到相同的鍵時,其值遞增。

END{ ... }讀取所有記錄時,將執行此塊,並且對於保存在數組中的每個鍵(我們定義x為變數索引以使用for循環遍歷該數組中的所有元素)我們使用所見 seen[x]的值作為新數組的鍵呼叫count和再次為同一個鍵增加值。

後來我們使用另一個循環並y作為變數索引首先列印它們的值count[y](即計數)和y它們的鍵。

引用自:https://unix.stackexchange.com/questions/440490