#!/bin/bash

awk '
    { 
        for(i = 1; i <= NF; i++) {
            arr[$i]++
        } 
    } 
    END{ 
        for(i in arr) {
            print i, arr[i]
        } 
    }
' nowcoder.txt | sort -k2,2n -k1,1

# NF  当前行的字段数量,默认分隔符是空白字符(空格,制表符(Tab), 多个连续的空白字符(被视为一个分隔符))
# END语句只执行一次
# sort -k2,2n -k1,1
# -k  指定排序的关键字
# 2,2 排序的起始字段 和 结束字段; 起始第2列,结束第2列
# n   按数字进行排序
# 先按 -k2,2n 排序,再按 -k1,1 排序

自测输入

welcome nowcoder
welcome to nowcoder
nowcoder

文件里有3行内容,awk每次处理一行

第一次总循环

$i 为 welcome
arr["welcome"]    即 arr["welcome"] = 0
arr["welcome"]++  即 arr["welcome"] = 1

$i 为 nowcoder
arr["nowcoder"]    即 arr["nowcoder"] = 0
arr["nowcoder"]++  即 arr["nowcoder"] = 1

第二次总循环

$i 为 welcome
arr["welcome"]++  即 arr["welcome"] = 2

$i 为 to
arr["to"]    即 arr["to"] = 0
arr["to"]++  即 arr["to"] = 1

$i 为 nowcoder
arr["nowcoder"]++  即 arr["nowcoder"] = 2

第三次总循环

$i 为 nowcoder
arr["nowcoder"]++  即 arr["nowcoder"] = 3

执行END语句

welcome 2
nowcoder 3
to 1

sort排序

to 1
welcome 2
nowcoder 3

END