Linux
你如何計算從 uniq -c 生成的第一列
我有一個文件,其中列出了 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
在上面
awk
,seen[$0]++
對於每個記錄,用空格或ewline分隔的****S\n
將整個記錄儲存到稱為鍵的關聯數組seen
中,當再次看到相同的鍵時,其值遞增。在
END{ ... }
讀取所有記錄時,將執行此塊,並且對於保存在數組中的每個鍵(我們定義x
為變數索引以使用for循環遍歷該數組中的所有元素)我們使用所見seen[x]
的值作為新數組的鍵呼叫count
和再次為同一個鍵增加值。後來我們使用另一個循環並
y
作為變數索引首先列印它們的值count[y]
(即計數)和y
它們的鍵。